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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1148閲覧

GAS。for文の中で2次配列に変換の方法

beginner100

総合スコア15

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/10/03 05:51

GASを使用していて、
現在「date」が1次配列になっているのですが、
これを2次配列として抽出して、setValuesでスプレッドシートに記載していきたいです。

var date2 = [date]
等試してみたのですが、for文の中だとうまくできていないのか2次配列にできず、困っています。

最終的には、スプレッドシートに記載できればよいのですが、
どなたかご教授お願い致します。

GAS

1function myFunction() { 2var Ss = SpreadsheetApp.getActiveSpreadsheet(); 3var master_sheet = Ss.getSheetByName("test"); 4var name_sheet = Ss.getSheetByName("name") 5var range = name_sheet.getRange(A1);  //A1には○○が入っている 6var set_sheet = Ss.getSheetByName("〇〇"); 7 8var values1 = master_sheet.getRange("A:A").getValues(); 9 10values1 = values1 .flat(); 11 12var index = values1.lastIndexOf("〇〇"); //3 13 14 var rows = master_sheet.getDataRange(); 15 16 var rows_values =rows.getValues(); 17 18 var numRows = rows.getNumRows(); 19 20 for(var i = 2;i<index+1;i++){ 21 if(rows_values[i][0] === range.getValue())  //A列が○○の所のデータを抽出 22 var date = rows_values[i]; 23/* 24console.log(date) 25 情報   [ '○○', '2021/09/02 (木)', '9:00' ] 26 情報   [ '○○', '2021/09/03 (金)', '9:00' ] 27 情報   [ '○○', '2021/09/04 (土)', '9:00' ] 28*/ 29 30 31set_sheet.getRange(1,1,3,3).setValues(date); 32 } 33 34} 35 36結果 37エラー 38Exception: The parameters (String) don't match the method signature for SpreadsheetApp.Range.setValues.

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

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

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

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

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

itagagaki

2021/10/03 05:58

1つのデータを9つのセルにどうセットしたいのですか?
beginner100

2021/10/03 06:35

言葉足らずで申し訳ありません。 例の場合ですと、 最終的に A1.2.3に〇〇が入って、 B1.2.3に日にち、 C1.2.3に時間が入るようにしたいです。 例ではデータが少ないですが、本来もっと多くなるので、valuesでできないかと考えていました。
itagagaki

2021/10/05 12:04 編集

え-と、ループでは行を1つずつ降りて行っているのですよね。 で、着目している行のA列が'○○'なら、set_sheet.getRange(1,1,3,3)に3×3のデータをセットしたいと。 で、その3×3のデータとは? その、今着目している行のA列~C列のデータをコピーするのでしょうか? でもそれなら1×3ですよね。 残りの2列にはどこのデータをコピーするのですか? 同じデータを繰り返し貼り付けるのですか?
beginner100

2021/10/05 12:45

今抽出したデータが一次配列なので、それをまとめて二次配列にしたら、3×3でセルに入れる事ができると思ったのですが… 今のデータを 情報  [ [ '○○', '2021/09/02 (木)', '9:00' ] , [ '○○', '2021/09/03 (金)', '9:00' ] , [ '○○', '2021/09/04 (土)', '9:00' ] ] というデータにする方法がわからなくて、質問さしていただきました。
itagagaki

2021/10/05 12:50

date はたとえば [ '○○', '2021/09/02 (木)', '9:00' ] なんですよね? [ '○○', '2021/09/03 (金)', '9:00' ] と [ '○○', '2021/09/04 (土)', '9:00' ] はどこからやって来るのですか?
beginner100

2021/10/05 13:19

元のmaster_sheetには、A列に「〇〇」や「XX」が入っていて、B列には 「2021/09/02 (木)」、「2021/09/03 (金)」などの曜日が、C列には「9:00」などの時間が入っています。 なので、console.log(date)をやると、今回だと上記の様な配列がそれぞれ出るようになってます。 そのdataの一次配列をまとめて、2次配列にして、セルに入力をしたいです。
itagagaki

2021/10/05 13:28

話が嚙み合わないので、正直言って少し面倒になりました。 もう一度同じことを聞きますが、ループの中で date はたとえば [ '○○', '2021/09/02 (木)', '9:00' ] になるんですよね? それなら [date] で1×3の二次元配列にして set_sheet.getRange(row,1,1,3).setValues([date]); すればいいんじゃないですか? どうして1×3しかないデータを3×3にしようとするんですか?
beginner100

2021/10/05 14:02 編集

A列    B列       C列 1 ○○ 2021/09/02 (木) 9:00 2 ○○   2021/09/03 (金)    9:00 3 ○○ 2021/09/04 (土) 9:00 4 ×× 2021/09/06 (月) 9:00 5 ×× 2021/09/07 (火) 9:00 これをループ内でconsole.log(date)すると、3つの1次関数になります。 ループ外でやった場合は、最後のデータ[ '○○', '2021/09/04 (土)', '9:00' ] だけになりますが、ほしいのはループ内で出てきたデータ3つが欲しいです。
guest

回答2

0

javascript

1const batchApply = () => { 2 const masterSheetName = "test"; 3 const nameListSheetName = "name"; 4 const spreadsheet = SpreadsheetApp.getActive(); 5 const masterData = spreadsheet.getSheetByName(masterSheetName).getDataRange().getValues(); 6 spreadsheet.getSheetByName(nameListSheetName).getDataRange().getValues().forEach(r=> { 7 selectAndCopy(spreadsheet,masterData,r[0]); 8 } 9 ); 10} 11const selectAndCopy = (spreadsheet,masterData, name, targetSheetName = "") => { 12 const hishersData = masterData.filter(r=>r[0] === name); 13 spreadsheet.getSheetByName(targetSheetName || name).getRange(1,1,hishersData.length,hishersData.length).setValues(hishersData) 14} 15const tester = () => { 16 const masterSheetName = "test"; 17 const nameListSheetName = "name"; 18 const spreadsheet = SpreadsheetApp.getActive(); 19 const masterData = spreadsheet.getSheetByName(masterSheetName).getDataRange().getValues(); 20 const name = spreadsheet.getSheetByName(nameListSheetName).getRange("A1").getValue(); 21 selectAndCopy(spreadsheet,masterData,name,"○○"); 22}

投稿2021/10/06 17:12

papinianus

総合スコア12705

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

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

0

ベストアンサー

とりあえず回答しますね。

転記すべき行が見つかったらその都度1行ずつ転記していくコード

GAS

1var set_row = 1; 2for (let i = 2; i <= index; i++) { 3 if (rows_values[i][0] === range.getValue()) { 4 const date = rows_values[i]; 5 set_sheet.getRange(set_row++,1,1,3).setValues([date]); 6 } 7}

次に、ループで見つかった転記すべき行を二次元配列にためていって、ループ終了後に転記するコード

GAS

1var values = []; 2for (let i = 2; i <= index; i++) { 3 if (rows_values[i][0] === range.getValue()) { 4 const date = rows_values[i]; 5 values.push(date); 6 } 7} 8set_sheet.getRange(1,1,3,3).setValues(values);

ただし、どちらのコードでも、二次元配列rows_valuesのカラム数は必ず3でなければなりません。
さらに、2つめのコードでは、rows_valuesの2行目からindex行目までの間から取り出された行の数は必ず3でなければなりません。
そうでない場合の考慮がなされておらず、参照するシートの内容によってはまずいことになります。
そうでない場合について考えなくてよいならいいのですが。
しかしこの質問への回答はここまでにしておきます。

投稿2021/10/05 14:37

itagagaki

総合スコア8402

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

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

beginner100

2021/10/06 13:01

二つも解決策を教えていただきありがとうございます。 カラム数については、2個目でしたら、2次配列なのでlengh使えばよさそうですね。 わかりにくい質問をしてしまい申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問