回答編集履歴

4

a

2021/01/14 03:11

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -124,11 +124,9 @@
124
124
 
125
125
  const data = book.getActiveSheet().getDataRange().getValues();
126
126
 
127
- const result = compare(data);
127
+ const format = squarize(result);
128
128
 
129
- book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format);
129
+ book.getSheetByName("1").getRange(1, 1, format.length, format[0].length).setValues(format);
130
-
131
- //sheet_output.getRange(1,1,4053,45).setValues(result);
132
130
 
133
131
  }
134
132
 

3

2021/01/14 03:11

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
 
10
10
 
11
- ところが実行したところ、下にサンプル出力を出しましたが、欲しいかたちとして私には全く理解不能でした。
11
+ ところが実行したところ、~~下にサンプル出力を出しましたが~~、欲しいかたちとして私には全く理解不能でした。
12
+
13
+ (出力が多すぎて(右に長くなりすぎて)10000字を越え、別回答にすら貼ることができませんでした。サンプルデータとコードをかいているので、実行と再現が可能なはずなので割愛しました)
12
14
 
13
15
 
14
16
 

2

a

2020/09/25 18:35

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -142,7 +142,7 @@
142
142
 
143
143
  | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q |
144
144
 
145
- | - | ------------ | - | - | - | - | - | - | - | - | - | - | -- | - | - | -- | - |
145
+ |--|------------|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
146
146
 
147
147
  | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 1 | 3 | 4 | 5 | |
148
148
 

1

あーたいへん

2020/09/25 18:30

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -1,27 +1,185 @@
1
- google apps script では長さの揃ってい配列配列はエラーのもと
1
+ 質問者様提示のコード(t()として再現)をエラーなく実行するために squarize が必要なので、実装しました
2
+
3
+ (sample data やその他のコードを補わなければ回答不能です。未知のものをこちらが妄想するほど望ましい回答からは離れますし、その的外れな空想のために不必要な誰も嬉しくない時間がかかることをどうかご理解いただきたいです)
2
4
 
3
5
 
4
6
 
5
- > [[a,b,c],[c,d,f,g],[h,i]]
7
+ なので、squarize だけ持っていけば実行可能だと思います。多分。
6
8
 
7
9
 
8
10
 
9
- とありますが、実際は`[[a,b,c,],[c,d,f,g],[h,i,,]]`のように,が連なっていませんか?(これはjsとしてはillegalな表記ですがログ出力するとこうなる例として示しています。)
10
-
11
- たとえばgetDataRanges().getValues()などするこうなります。,の個数getRanges()のパラメータによって変わります
11
+ ところが実行したところ、下にサンプル出力出しましたが、欲しいかたちして私に全く理解不能でした
12
12
 
13
13
 
14
14
 
15
- た、かりに
15
+ 得ようとしている結果はデータ構造としておすすめできない形式ですが、すくなくとも一定程度の整合性をもせるにはq293827() 程度の一貫的な結果が必要なのではないでしょう
16
+
17
+ いちおう sample では末尾列に a があるかないかで不揃いにしています。もし元データがもっと不揃いなのだとしたら、q293827() だと空白が間にはさまってしまって不適切だと思いますが、右に展開した列が各列で不揃いであるほうがより良くないと考えて再構成しました。
16
18
 
17
19
 
18
20
 
21
+
22
+
19
- > [[a,b,c],[c,d,f,g,j,k,l],[h,i]]
23
+ 本来やりたかったことに立ち返って、元データから見直すことをご提案いたします。ご検討いただければと思います。
20
24
 
21
25
 
22
26
 
27
+ ```javascript
28
+
29
+ const notOk = (data) => {
30
+
31
+ const isNotOk = {"col":15,"val":"ok"};
32
+
33
+ return data.filter(e=>e[isNotOk.col] !== isNotOk.val);
34
+
35
+ };
36
+
37
+ const buildDicForSingle = (data) => {
38
+
39
+ const isSingle = {"col":1,"val":"SinglePhrase"};
40
+
41
+ const wordCol = 12;
42
+
43
+ return new Map(data.reduce((a,c,i)=>c[isSingle.col] === isSingle.val ? a.concat([[c[wordCol],i]]):a,[]));
44
+
45
+ }
46
+
47
+ const merge = (data,map) => {
48
+
49
+ const wordCol = 12;
50
+
51
+ return data.reduce((a,c,i)=>{ Logger.log(a);return map.has(c[wordCol]) ? ((map.get(c[wordCol]) !== i) ? a : a.concat([data.filter(e=>e[wordCol] === c[wordCol]).flat()])) : a.concat([c])},[]);
52
+
53
+ }
54
+
55
+ const squarize = (jag) => {
56
+
57
+ const maxLen = Math.max(...jag.map(e=>e.length));
58
+
23
- となったとしてもsetValues()したときに列数と配列の要素数が合わないエラーとなります。
59
+ const empties = Array(maxLen).fill("");
60
+
61
+ return jag.map(e=> e.concat(empties).slice(0,maxLen));
62
+
63
+ }
64
+
65
+ const q293827 = () => {
66
+
67
+ const book = SpreadsheetApp.getActive();
68
+
69
+ const data = book.getActiveSheet().getDataRange().getValues();
70
+
71
+ const notok = notOk(data);
72
+
73
+ const dic = buildDicForSingle(notok);
74
+
75
+ const res = merge(notok,dic);
76
+
77
+ const format = squarize(res);
78
+
79
+ if(format.length < 1) return;
80
+
81
+ book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format);
82
+
83
+ }
24
84
 
25
85
 
26
86
 
87
+ function compare(data) {
88
+
89
+ let newarray = []
90
+
91
+ for(var i=1; i < 5000 ; i++){
92
+
93
+ if(data[i][15] !== "ok")
94
+
95
+ newarray.push(data[i])
96
+
97
+ for(var j=2; j < 5001 ; j++){
98
+
99
+ if(i !== j && data[i][1] === "SinglePhrase" && data[j][1] === "SinglePhrase" && data[j][15] !== "ok"){
100
+
101
+ if (data[i][12] === data[j][12] ) {
102
+
103
+ newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(data[j]);
104
+
105
+ data[j].push("ok")
106
+
107
+ }
108
+
109
+ }
110
+
111
+ }
112
+
113
+ }
114
+
115
+ return newarray
116
+
117
+ }
118
+
119
+ function t() {
120
+
121
+ const book = SpreadsheetApp.getActive();
122
+
123
+ const data = book.getActiveSheet().getDataRange().getValues();
124
+
125
+ const result = compare(data);
126
+
27
- 従って、起こっているエラーは前後のコードブロックの影響をうけ、解決策はやりたいことに依存するので、その他の部分のコードとやりたいことを書いていただくことは意味のある回答を書くために必要不可欠です。追記よろしくお願いします
127
+ book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format);
128
+
129
+ //sheet_output.getRange(1,1,4053,45).setValues(result);
130
+
131
+ }
132
+
133
+
134
+
135
+
136
+
137
+ ```
138
+
139
+ -- sample data
140
+
141
+
142
+
143
+ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q |
144
+
145
+ | - | ------------ | - | - | - | - | - | - | - | - | - | - | -- | - | - | -- | - |
146
+
147
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 1 | 3 | 4 | 5 | |
148
+
149
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | 5 | a |
150
+
151
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | 5 | |
152
+
153
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | 5 | a |
154
+
155
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | 5 | |
156
+
157
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | 5 | a |
158
+
159
+ | | a | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | 5 | |
160
+
161
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | 5 | a |
162
+
163
+ | | a | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 9 | 3 | 4 | 5 | |
164
+
165
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 10 | 3 | 4 | 5 | a |
166
+
167
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 1 | 3 | 4 | ok | |
168
+
169
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | ok | a |
170
+
171
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | ok | |
172
+
173
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | ok | a |
174
+
175
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | ok | |
176
+
177
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | ok | a |
178
+
179
+ | | a | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | ok | |
180
+
181
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | ok | a |
182
+
183
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 9 | 3 | 4 | ok | |
184
+
185
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 10 | 3 | 4 | ok | a |