teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

a

2021/01/14 03:11

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -61,9 +61,8 @@
61
61
  function t() {
62
62
  const book = SpreadsheetApp.getActive();
63
63
  const data = book.getActiveSheet().getDataRange().getValues();
64
- const result = compare(data);
64
+ const format = squarize(result);
65
- book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format);
65
+ book.getSheetByName("1").getRange(1, 1, format.length, format[0].length).setValues(format);
66
- //sheet_output.getRange(1,1,4053,45).setValues(result);
67
66
  }
68
67
 
69
68
 

3

2021/01/14 03:11

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -3,7 +3,8 @@
3
3
 
4
4
  → なので、squarize だけ持っていけば実行可能だと思います。多分。
5
5
 
6
- ところが実行したところ、下にサンプル出力を出しましたが、欲しいかたちとして私には全く理解不能でした。
6
+ ところが実行したところ、~~下にサンプル出力を出しましたが~~、欲しいかたちとして私には全く理解不能でした。
7
+ (出力が多すぎて(右に長くなりすぎて)10000字を越え、別回答にすら貼ることができませんでした。サンプルデータとコードをかいているので、実行と再現が可能なはずなので割愛しました)
7
8
 
8
9
  得ようとしている結果はデータ構造としておすすめできない形式ですが、すくなくとも一定程度の整合性をもたせるには、q293827() 程度の一貫的な結果が必要なのではないでしょうか。
9
10
  いちおう sample では末尾列に a があるかないかで不揃いにしています。もし元データがもっと不揃いなのだとしたら、q293827() だと空白が間にはさまってしまって不適切だと思いますが、右に展開した列が各列で不揃いであるほうがより良くないと考えて再構成しました。

2

a

2020/09/25 18:35

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -70,7 +70,7 @@
70
70
  -- sample data
71
71
 
72
72
  | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q |
73
- | - | ------------ | - | - | - | - | - | - | - | - | - | - | -- | - | - | -- | - |
73
+ |--|------------|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
74
74
  | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 1 | 3 | 4 | 5 | |
75
75
  | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | 5 | a |
76
76
  | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | 5 | |

1

あーたいへん

2020/09/25 18:30

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -1,14 +1,93 @@
1
- google apps script では長さ揃っない配列の配列はエラーのもと
1
+ 質問者様提示コード(t()とし再現)をエラーなく実行するために squarize が必要なので、実装しました
2
+ (sample data やその他のコードを補わなければ回答不能です。未知のものをこちらが妄想するほど望ましい回答からは離れますし、その的外れな空想のために不必要な誰も嬉しくない時間がかかることをどうかご理解いただきたいです)
2
3
 
3
- > [[a,b,c],[c,d,f,g],[h,i]]
4
+ なので、squarize だけ持っていけば実行可能だと思います。多分。
4
5
 
5
- とありますが、実際は`[[a,b,c,],[c,d,f,g],[h,i,,]]`のように,が連なっていませんか?(これはjsとしてはillegalな表記ですがログ出力するとこうなる例として示しています。)
6
- たとえばgetDataRanges().getValues()などをするとうなります。,の個数はgetRanges()のパラメータよって変わり
6
+ ところが実行したところ、下サンプル出力を出ししたが、欲しいかたちとして私には全く理解不能でした
7
7
 
8
- た、かりに
8
+ 得ようとしている結果はデータ構造としておすすめできない形式ですが、すくなくとも一定程度の整合性をもせるにはq293827() 程度の一貫的な結果が必要なのではないでしょう
9
+ いちおう sample では末尾列に a があるかないかで不揃いにしています。もし元データがもっと不揃いなのだとしたら、q293827() だと空白が間にはさまってしまって不適切だと思いますが、右に展開した列が各列で不揃いであるほうがより良くないと考えて再構成しました。
9
10
 
10
- > [[a,b,c],[c,d,f,g,j,k,l],[h,i]]
11
11
 
12
- となったともsetValues()したときに列数と配列の要素数が合わなエラーとなります。
12
+ 本来やりたかったに立ち返っ、元データから見直すことをご提案いたます。ご検討いだければいます。
13
13
 
14
+ ```javascript
15
+ const notOk = (data) => {
16
+ const isNotOk = {"col":15,"val":"ok"};
17
+ return data.filter(e=>e[isNotOk.col] !== isNotOk.val);
18
+ };
19
+ const buildDicForSingle = (data) => {
20
+ const isSingle = {"col":1,"val":"SinglePhrase"};
21
+ const wordCol = 12;
14
- 従って、起こっているエラーは前後のコードブロックの影響をうけ、解決策はやりたいことに依存するので、その他の部分のコードとやりたいことを書いていただくことは意味のある回答を書くために必要不可欠です。追記よろしくお願いします
22
+ return new Map(data.reduce((a,c,i)=>c[isSingle.col] === isSingle.val ? a.concat([[c[wordCol],i]]):a,[]));
23
+ }
24
+ const merge = (data,map) => {
25
+ const wordCol = 12;
26
+ 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])},[]);
27
+ }
28
+ const squarize = (jag) => {
29
+ const maxLen = Math.max(...jag.map(e=>e.length));
30
+ const empties = Array(maxLen).fill("");
31
+ return jag.map(e=> e.concat(empties).slice(0,maxLen));
32
+ }
33
+ const q293827 = () => {
34
+ const book = SpreadsheetApp.getActive();
35
+ const data = book.getActiveSheet().getDataRange().getValues();
36
+ const notok = notOk(data);
37
+ const dic = buildDicForSingle(notok);
38
+ const res = merge(notok,dic);
39
+ const format = squarize(res);
40
+ if(format.length < 1) return;
41
+ book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format);
42
+ }
43
+
44
+ function compare(data) {
45
+ let newarray = []
46
+ for(var i=1; i < 5000 ; i++){
47
+ if(data[i][15] !== "ok")
48
+ newarray.push(data[i])
49
+ for(var j=2; j < 5001 ; j++){
50
+ if(i !== j && data[i][1] === "SinglePhrase" && data[j][1] === "SinglePhrase" && data[j][15] !== "ok"){
51
+ if (data[i][12] === data[j][12] ) {
52
+ newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(data[j]);
53
+ data[j].push("ok")
54
+ }
55
+ }
56
+ }
57
+ }
58
+ return newarray
59
+ }
60
+ function t() {
61
+ const book = SpreadsheetApp.getActive();
62
+ const data = book.getActiveSheet().getDataRange().getValues();
63
+ const result = compare(data);
64
+ book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format);
65
+ //sheet_output.getRange(1,1,4053,45).setValues(result);
66
+ }
67
+
68
+
69
+ ```
70
+ -- sample data
71
+
72
+ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q |
73
+ | - | ------------ | - | - | - | - | - | - | - | - | - | - | -- | - | - | -- | - |
74
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 1 | 3 | 4 | 5 | |
75
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | 5 | a |
76
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | 5 | |
77
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | 5 | a |
78
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | 5 | |
79
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | 5 | a |
80
+ | | a | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | 5 | |
81
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | 5 | a |
82
+ | | a | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 9 | 3 | 4 | 5 | |
83
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 10 | 3 | 4 | 5 | a |
84
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 1 | 3 | 4 | ok | |
85
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | ok | a |
86
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | ok | |
87
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | ok | a |
88
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 30 | 3 | 4 | ok | |
89
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 20 | 3 | 4 | ok | a |
90
+ | | a | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | ok | |
91
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 40 | 3 | 4 | ok | a |
92
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 9 | 3 | 4 | ok | |
93
+ | | SinglePhrase | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 10 | 3 | 4 | ok | a |