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

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

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

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

Q&A

解決済

1回答

669閲覧

二次元配列から条件に一致する1行の転記について

haruharu

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2022/03/26 17:00

シート1から二次元配列で取得したリストを編集した後、条件に一致する行をシート2に
転記しようとしていますが、転記する箇所でエラーになり解決することができず行き詰まっております。
セルを1つ1つ指定すると解決するのですが、できれば1行で転記してしまいたいです。

エラーの箇所 : sh1.getRange(m,1,m,6).setValues(c_list);
ロ    グ : [[1班,100012,一二田,一二美,2022/04/15,2022/05/29]]

エラーメッセージ
Exception: The number of rows in the data does not match the number of rows in the range. The data has 1 but the range has 2.
listUp @ alert.gs:41

ソースコード

GoogleAppsScript

1function listUp() { 2 3 let n = 0;//リストの行を数えるカウント変数 4 let m = 2;//転記先の行を数えるカウント変数 5 const bk = SpreadsheetApp.openById("スプレッドシートID"); 6 const sh = bk.getSheetByName("リスト"); 7 const sh1 = bk.getSheetByName("転記用"); 8 9 //★指定列の一番下の行番号を取得する 10 let maxRng = sh.getRange(sh.getMaxRows(), 2); 11 let lastRng = maxRng.getNextDataCell(SpreadsheetApp.Direction.UP); 12 let lastraw = lastRng.getRow(); 13 14 //★日付の変数 15 const day0 = new Date(); 16 const day_30 = day0.setDate(day0.getDate() + 30); 17 const day_45 = day0.setDate(day0.getDate() + 45); 18 19 //★閲覧用シートをクリアして項目名を(1行目、1列目のセル、から1行目、6列目のセル)まで入れる 20 sh1.clearContents(); 21 sh1.getRange(1,1,1,6).setValues([["班","ID","姓","名","期日1","期日2"]]); 22 23 //★表から継続中リストを取得する 24 let list = sh.getRange(2,1,lastraw,15).getValues(); 25 list= list.filter(elm => elm[1] == '継続中'); 26 list= list.map(elm => [elm[11],elm[10],elm[12],elm[13],elm[6],elm[14]]); 27 while(n<list.length){ 28 29 //★もし今日より期日1が30日以内か期日2が45日以内なら 30 if( day_30 >= list[n][4] || day_45 >= list[n][5]){ 31 list[n][4] = Utilities.formatDate(list[n][4],'JST', 'yyyy/MM/dd'); 32 list[n][5] = Utilities.formatDate(list[n][5],'JST', 'yyyy/MM/dd'); 33 c_list = [[list[n][0] + ',' 34 + list[n][1] + ',' 35 + list[n][2] + ',' 36 + list[n][3] + ',' 37 + list[n][4] + ',' 38 + list[n][5]]]; 39 40 //★転記用に班から期日2までを転記 41 sh1.getRange(m,1,m,6).setValues(c_list); 42 //★カウント変数mに1加算して次に書き込むときの転記用の行を1行下に指定する 43 m++; 44 } 45 //★カウント関数nに1加算して継続中リスト次の行を見に行く 46 n++; 47 } 48}

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行できていませんが、気づいたところだけ
1.

c_list = [[list[n][0] + ',' + list[n][1] + ',' + list[n][2] + ',' + list[n][3] + ',' + list[n][4] + ',' + list[n][5]]];

これだと、文字列のカンマで連結しているので、1行6列ではなく、1列のデータになってしまいます。
配列を作る時は、要素をカンマで区切ればよく、文字列のカンマ(',')で連結する必要はありません。

<修正後>

c_list = [[list[n][0], list[n][1], list[n][2], list[n][3], list[n][4], list[n][5]]];

2.

sh1.getRange(m,1,m,6).setValues(c_list);

第3引数がmとなっていますので、これだと毎回m行分取得してしまいます。
getRange(開始行,開始列,行数,列数)
ここは1行だけ取得すればよいので、第3引数は1で良いです。

sh1.getRange(m,1,1,6).setValues(c_list);

以上の修正を反映した全コードは下記になります。

js

1function listUp() { 2 3 let n = 0;//リストの行を数えるカウント変数 4 let m = 2;//転記先の行を数えるカウント変数 5 const bk = SpreadsheetApp.openById("スプレッドシートID"); 6 const sh = bk.getSheetByName("リスト"); 7 const sh1 = bk.getSheetByName("転記用"); 8 9 //★指定列の一番下の行番号を取得する 10 let maxRng = sh.getRange(sh.getMaxRows(), 2); 11 let lastRng = maxRng.getNextDataCell(SpreadsheetApp.Direction.UP); 12 let lastraw = lastRng.getRow(); 13 14 //★日付の変数 15 const day0 = new Date(); 16 const day_30 = day0.setDate(day0.getDate() + 30); 17 const day_45 = day0.setDate(day0.getDate() + 45); 18 19 //★閲覧用シートをクリアして項目名を(1行目、1列目のセル、から1行目、6列目のセル)まで入れる 20 sh1.clearContents(); 21 sh1.getRange(1,1,1,6).setValues([["班","ID","姓","名","期日1","期日2"]]); 22 23 //★表から継続中リストを取得する 24 let list = sh.getRange(2,1,lastraw,15).getValues(); 25 list= list.filter(elm => elm[1] == '継続中'); 26 list= list.map(elm => [elm[11],elm[10],elm[12],elm[13],elm[6],elm[14]]); 27 while(n<list.length){ 28 29 //★もし今日より期日1が30日以内か期日2が45日以内なら 30 if( day_30 >= list[n][4] || day_45 >= list[n][5]){ 31 list[n][4] = Utilities.formatDate(list[n][4],'JST', 'yyyy/MM/dd'); 32 list[n][5] = Utilities.formatDate(list[n][5],'JST', 'yyyy/MM/dd'); 33 c_list = [[list[n][0], list[n][1], list[n][2], list[n][3], list[n][4], list[n][5]]]; 34 35 //★転記用に班から期日2までを転記 36 sh1.getRange(m,1,1,6).setValues(c_list); 37 //★カウント変数mに1加算して次に書き込むときの転記用の行を1行下に指定する 38 m++; 39 } 40 //★カウント関数nに1加算して継続中リスト次の行を見に行く 41 n++; 42 } 43}

その他:
c_listはlist[n]の全要素を参照しているだけなので、
下記でもよいと思います。

diff

12 //★表から継続中リストを取得する 34 while(n<list.length){ 5 6 //★もし今日より期日1が30日以内か期日2が45日以内なら 7 if( day_30 >= list[n][4] || day_45 >= list[n][5]){ 8 list[n][4] = Utilities.formatDate(list[n][4],'JST', 'yyyy/MM/dd'); 9 list[n][5] = Utilities.formatDate(list[n][5],'JST', 'yyyy/MM/dd'); 10 11 //★転記用に班から期日2までを転記 12+ sh1.getRange(m,1,1,6).setValues([list[n]]);

投稿2022/03/26 22:09

編集2022/03/26 22:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

haruharu

2022/03/26 23:08

丁寧なご回答を下さりありがとうございます、カンマのご指摘を始めとても勉強になりました。 設定する側ばかりを気にしてgetRangeの引数を全く変えずに修正を試みていましたが、 第三引数を直してsetValuesの中もその他に頂戴した書き方で実行を確認でき、解決致しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問