質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2808閲覧

gas 二次元配列結合

gomagoma00

総合スコア2

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/24 08:26

編集2020/09/25 04:49

gasで二次元配列の中にある配列に結合したいです。
[[a,b,c],[c,d,f,g],[h,i]]と二次元配列があり[j,k,l]を追加し[[a,b,c],[c,d,f,g,j,k,l],[h,i]]のような形にしたいです。

concatやpushを使ってもエラーが起きたり欲しい結果が得られませんでした。

function compare(data) { let newarray = [] for(var i=1; i < 5000 ; i++){ if(data[i][15] !== "ok") newarray.push(data[i]) for(var j=2; j < 5001 ; j++){ if(i !== j && data[i][1] === "SinglePhrase" && data[j][1] === "SinglePhrase" && data[j][15] !== "ok"){ if (data[i][12] === data[j][12] ) { newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(data[j]);      data[j].push("ok") } } } } return newarray } const result = compare(data) sheet_output.getRange(1,1,4053,45).setValues(result);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

draq

2020/09/24 09:27

concatやpushをどう使ったのでしょうか?
guest

回答2

0

ベストアンサー

質問者様提示のコード(t()として再現)をエラーなく実行するために squarize が必要なので、実装しました。
(sample data やその他のコードを補わなければ回答不能です。未知のものをこちらが妄想するほど望ましい回答からは離れますし、その的外れな空想のために不必要な誰も嬉しくない時間がかかることをどうかご理解いただきたいです)

→ なので、squarize だけ持っていけば実行可能だと思います。多分。

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

得ようとしている結果はデータ構造としておすすめできない形式ですが、すくなくとも一定程度の整合性をもたせるには、q293827() 程度の一貫的な結果が必要なのではないでしょうか。
いちおう sample では末尾列に a があるかないかで不揃いにしています。もし元データがもっと不揃いなのだとしたら、q293827() だと空白が間にはさまってしまって不適切だと思いますが、右に展開した列が各列で不揃いであるほうがより良くないと考えて再構成しました。

本来やりたかったことに立ち返って、元データから見直すことをご提案いたします。ご検討いただければと思います。

javascript

1const notOk = (data) => { 2 const isNotOk = {"col":15,"val":"ok"}; 3 return data.filter(e=>e[isNotOk.col] !== isNotOk.val); 4}; 5const buildDicForSingle = (data) => { 6 const isSingle = {"col":1,"val":"SinglePhrase"}; 7 const wordCol = 12; 8 return new Map(data.reduce((a,c,i)=>c[isSingle.col] === isSingle.val ? a.concat([[c[wordCol],i]]):a,[])); 9} 10const merge = (data,map) => { 11 const wordCol = 12; 12 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])},[]); 13} 14const squarize = (jag) => { 15 const maxLen = Math.max(...jag.map(e=>e.length)); 16 const empties = Array(maxLen).fill(""); 17 return jag.map(e=> e.concat(empties).slice(0,maxLen)); 18} 19const q293827 = () => { 20 const book = SpreadsheetApp.getActive(); 21 const data = book.getActiveSheet().getDataRange().getValues(); 22 const notok = notOk(data); 23 const dic = buildDicForSingle(notok); 24 const res = merge(notok,dic); 25 const format = squarize(res); 26 if(format.length < 1) return; 27 book.getSheetByName("1").getRange(1,1,format.length,format[0].length).setValues(format); 28} 29 30function compare(data) { 31 let newarray = [] 32 for(var i=1; i < 5000 ; i++){ 33 if(data[i][15] !== "ok") 34 newarray.push(data[i]) 35 for(var j=2; j < 5001 ; j++){ 36 if(i !== j && data[i][1] === "SinglePhrase" && data[j][1] === "SinglePhrase" && data[j][15] !== "ok"){ 37 if (data[i][12] === data[j][12] ) { 38 newarray[newarray.length - 1] = newarray[newarray.length - 1].concat(data[j]); 39 data[j].push("ok") 40 } 41 } 42 } 43 } 44 return newarray 45} 46function t() { 47 const book = SpreadsheetApp.getActive(); 48 const data = book.getActiveSheet().getDataRange().getValues(); 49 const format = squarize(result); 50 book.getSheetByName("1").getRange(1, 1, format.length, format[0].length).setValues(format); 51} 52 53

-- sample data

ABCDEFGHIJKLMNOPQ
SinglePhrase23456789011345
SinglePhrase234567890120345a
SinglePhrase234567890130345
SinglePhrase234567890120345a
SinglePhrase234567890130345
SinglePhrase234567890120345a
a234567890140345
SinglePhrase234567890140345a
a23456789019345
SinglePhrase234567890110345a
SinglePhrase2345678901134ok
SinglePhrase23456789012034oka
SinglePhrase23456789013034ok
SinglePhrase23456789012034oka
SinglePhrase23456789013034ok
SinglePhrase23456789012034oka
a23456789014034ok
SinglePhrase23456789014034oka
SinglePhrase2345678901934ok
SinglePhrase23456789011034oka

投稿2020/09/25 01:34

編集2021/01/14 03:11
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gomagoma00

2020/09/25 01:49

ありがとうございます。コードを記入しました。 いろいろ試してみて[[a,b,c],[c,d,f,g,j,k,l],[h,i]]の形にはなったのですがpapinianusさんのおっしゃる通り配列の要素数が合わずsetValues()でエラーが起きてしまいます。この問題を解消するためにはどうしたらよろしいでしょうか? whileを使い空白を追加するなどをやろうとしましたがうまくいきませんでした。
papinianus

2020/09/25 01:58

電車にのったので後ほどコードかきます。 確認ですが、dataは4053行×45列ですか? あとこの方法だとシートに上書きが起こりますがよいのですね?
gomagoma00

2020/09/25 02:02

行数はnewarrayの最大行数にしたく、列数は15,30,45などが混ざっているためエラーが起きてしまうのでこれを最大の列数に統一していただきたいです。
gomagoma00

2020/09/25 04:50

もう少し書いたコードを詳しくかきました。シートに上書きされるのは大丈夫です。 よろしくお願いします。
gomagoma00

2020/09/25 13:23

すみません、教えてもらっている立場で大変申し訳ないのですがいつ頃コードは書き終わりそうでしょうか?
gomagoma00

2020/09/26 09:02

わざわざありがとうございます。 一度データを見直して新しい方法を検討してみようと思います。
gomagoma00

2020/09/26 09:14

while分を使って空白を追加しようと試みているのですがうまく機能しないのでもしよろしければご教授ください。 新しい質問を投稿しました。
guest

0

const array = [[a,b,c],[c,d,f,g],[h,i]];
const result = array[1].push(j,k,l);

でどうでしょうか?

投稿2020/09/25 00:01

編集2020/09/25 00:05
Neru_K

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問