🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

Q&A

解決済

1回答

570閲覧

スプレッドシートの内容を配列やfor文で取得し、メールで送信したい

rimmy

総合スコア2

Google Apps Script

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

0グッド

0クリップ

投稿2021/03/17 08:57

編集2021/03/17 09:25

前提・実現したいこと

現在GASで、その日の作業をメールで通知するようなコードを作成しています。
スプレッドシート上で対象作業を集計して一覧にしているので、
その内容をメールでそのまま送るような仕様で考えています。

コード上、作業一覧は2つの範囲で取得しているのですが、
スプレッドシート上では以下のような構成にしています。
※内容は日時で更新される

作業1作業2
追加1削除1
追加2削除2
追加3

また、メールの送信イメージはこのような感じです↓

--------------------------------
本日の作業をお知らせします。

【作業1】
①追加1
②追加2
③追加3

【作業2】
①削除1
②削除2

以上
--------------------------------

発生している問題・エラーメッセージ

冒頭から対象セルの取得までと、通知設定で必要な情報を1件ずつ取得する以降の処理は問題なくできましたが、
作業一覧で必要な情報を1件ずつ取得するfor文で以下のエラーがでています。

TypeError: Cannot read property '0' of undefined

該当のソースコード

GAS

1 //作業一覧で必要な情報を1件ずつ取得 2 for(var i = 0; i < tableAdd.length; i++){ 3 var bodyAdd = tableAdd[i][0]; 4 var bodyDelete = tableAdd[i][1]; 5 }

全体のソースコード

GAS

1function sendNotification(){ 2 //スプレッドシートの取得 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 5 //対象シートの取得 6 const sheet = ss.getSheetByName('作業一覧'); 7 const sheetTsuchi = ss.getSheetByName('通知設定'); 8 9 //対象セルの取得 10 var tableAdd = sheet.getRange(5,20,36).getValues(); //作業1 11 var tableDelete = sheet.getRange(5,21,36).getValues(); //作業2 12 var tableTsuchi = sheetTsuchi.getDataRange().getValues(); //送信用の設定一覧 13 14 15 //作業一覧で必要な情報を1件ずつ取得 16 for(var i = 0; i < tableAdd.length; i++){ 17 var bodyAdd = tableAdd[i][0]; 18 var bodyDelete = tableAdd[i][1]; 19 } 20 21 //通知設定で必要な情報を1件ずつ取得 22 for(var s = 1; s < tableTsuchi.length; s++){ 23 var mailTo = tableTsuchi[0][1]; //宛先 24 var subject = tableTsuchi[1][1]; //件名 25 var text = tableTsuchi[2][1]; //定型文 26 } 27 28 29 var body = text + '\n\n' + bodyAdd + '\n\n' + bodyDelete; 30 31 //メール送信 32 GmailApp.sendEmail(mailTo, subject, body); 33 34}

試したこと

配列指定先をvar bodyAdd = tableAdd[0][0];にすれば「作業1」の項目だけ取得できますが、
変数に変えてしまうと送信イメージのような列の情報全てが縦に並ぶ形に出力ができません。。

GASを始めたばかりのため配列のやり方をよくわかっておらず
見苦しいコードかと思いますが、どなたか正解を教えていただけますと幸いです。

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1var tableAdd = sheet.getRange(5,20,36).getValues();

こちらの5, 20, 36で本来取得したい箇所が取れていない可能性があります。
getRangeの引数を3つに指定した場合、
getRange(a, b, c)
a…取得したい行番号の最初の番号
b…取得したい列番号
c…aで指定した行番号を起点として何行分のデータがほしいか
という条件になります。↓参照
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow,-column,-numrows

今回ですと、解析するとセルの範囲がT5:T40になってしまっているかと思います。
確認する方法として、tableAddを一度console.logで吐き出して、どんな値が取得されているかを確認してみるとわかりやすいかと思います。

今回の場合ですと、getRangeは引数を4つにしたほうが良いかもしれません。
getRange(a, b, c, d)
a…取得したい行番号の最初の番号
b…取得したい列番号
c…aで指定した行番号を起点として何行分のデータがほしいか
d…bで指定した行番号を起点として何列分のデータがほしいか
となりますので、例えば、getRange(2, 1, 3, 2)と指定すると、
セル番号にするとA2:B4を範囲選択することになります。

投稿2021/03/21 07:53

yoshi_10_11

総合スコア241

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

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

rimmy

2021/03/22 06:32

ご丁寧に解説いただきありがとうございます! 範囲を整理してご教示いただいたような設定をしたところ、値を取得することができました。 今後も引数を注意してやってみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問