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

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

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

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Q&A

1回答

1384閲覧

スプレッドシートとGASでGmailの自動送信をしたいです。

rrr17

総合スコア1

Google スプレッドシート

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

0グッド

0クリップ

投稿2022/07/13 12:58

GASとスプレッドシートを使って、自動でメールが送信されるようにしたいです。

【スプレッドシート】
タスクを管理しています。
複数人で管理しており、終わった人は自分の名前の列、対象のタスクの行、のセルにあるチェックボックスにチェックを入れます。(シート1)

・昨日が期限だがまだチェックが入ってない人
・今日が期限だがチェックがまだ入ってない人
・明日が期限だがチェックがまだ入ってない人
に自動でメールが送信されるようにしたいです。

シート1、シート2、シート3を使い、シート4に以下の内容が表示されるようにはできました。
◎シート4

ABCD
1配信日TO件名本文
2(今日の日付)a@aa.com,b@aa.com昨日までのタスクが~~~~
3(今日の日付)a@aa.com昨日までのタスクが~~~~
4(今日の日付)c@aa.com昨日までのタスクが~~~~
5(今日の日付)a@aa.com,d@aa.com今日までのタスクが~~~~
6(今日の日付)d@aa.com今日までのタスクが~~~~
7(今日の日付)c@aa.com今日までのタスクが~~~~
8(今日の日付)e@aa.com,g@aa.com明日までのタスクが~~~~
9(今日の日付)a@aa.com明日までのタスクが~~~~
:::::

A列はtoday関数です。
B列は表示するまでに、filter関数、if関数、today関数を使用しています。
C列は直接入力しています。
D列は表示するまでに、filter関数、if関数、today関数を使用しています。その他"&"、"CHAR(10)"を使っています。

◎GAS
https://blog.members.co.jp/article/46994
を参考にして、設定でき送信も問題なくできたのですが、これだと1行しか実行できません。

GAS

1const sheet = SpreadsheetApp.getActive().getSheetByName('シート4');//''の間にシート名を入れるとそのシート名の情報を持ってくる 2const recipient = sheet.getRange(2, 2).getValue(); // TO B2 3const subject = sheet.getRange(2, 3).getValue(); // 件名 C2 4const body = sheet.getRange(2, 4).getValue(); // 本文 D2 5const remind_hour = "21";//この時間だけ動作 6const date = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd"); //今日の日付 7const hour = Utilities.formatDate(new Date(), "Asia/Tokyo", "H"); //今の時間 8const workday = Utilities.formatDate(sheet.getRange(2, 1).getValue(), "Asia/Tokyo", "yyyy/MM/dd"); //配信日 A2 9 10function sendMail(){ 11if(hour == remind_hour && workday == date){ //日時が合っているか 12GmailApp.sendEmail(recipient, subject, body, 13{from:'info@aa.com', 14name:'タスク通知' 15}); //下書きにする場合はcreateDraft、直接送る場合はsendEmail 16} 17} 18 19function onOpen(){ 20SpreadsheetApp.getUi() 21.createMenu('メール') 22.addItem('メール送信', 'sendMail') 23.addToUi(); 24} 25 26

75行すべて実行したいのですが、どのように書き換えたらいいのでしょうか...
また、可能であれば「昨日期限」「今日期限」「明日期限」で送信時刻を変えたいです。

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

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

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

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

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

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

guest

回答1

0

gs

1const recipient = sheet.getRange(2, 2).getValue(); // TO B2 2const subject = sheet.getRange(2, 3).getValue(); // 件名 C2 3const body = sheet.getRange(2, 4).getValue(); // 本文 D2

ここで単一行しか取得していないので、1行しか実行されません。

gs

1const recipients = sheet.getRange(2, 2, 74, 1).getValues().flat(); // TO B2~B75 2const subjects = sheet.getRange(2, 3, 74, 1).getValues().flat(); // 件名 C2~C75 3const bodys = sheet.getRange(2, 4, 74, 1).getValues().flat(); // 本文 D2~D75 4 5for (let i = 1; i <= 75; i++) { 6 let recipient = recipients[i-1] 7 let subject = subjects[i-1] 8 let body = bodys[i-1] 9 GmailApp.sendEmail(recipient, subject, body, 10 { 11 from: 'info@aa.com', 12 name: 'タスク通知' 13 }); //下書きにする場合はcreateDraft、直接送る場合はsendEmail 14 }

複数行取得するようにすれば実現可能ではないかと思います。


送信時間を変えるについては、判別できる情報があれば
下記のようにすることで変更可能になります。

gs

1// 上から、昨日期限、今日期限、明日期限の 送信時間 2const yesterdayDeadlineHour = "18" 3const todayDeadlineHour = "20" 4const tomorrowDeadlineHour = "22" 5let remind_hour = "21";// 代入させるため、letに変更 6 7// セルから取得するなど 8let xxxx = "??期限" 9 10if (xxxx == "昨日期限") remind_hour = yesterdayDeadlineHour 11else if (xxxx == "今日期限") remind_hour = todayDeadlineHour 12else if (xxxx == "明日期限") remind_hour = tomorrowDeadlineHour 13 14if (hour == remind_hour && workday == date) { //日時が合っているか 15 16・・・以下略・・・

投稿2022/07/14 01:43

k.a_teratail

総合スコア845

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

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

rrr17

2022/07/14 03:44

ありがとうございます! できました! 追加で質問させて頂いてもいいでしょうか? 今後行数を増やす可能性があるのですが、どこを変更したらいいでしょうか。
k.a_teratail

2022/07/14 04:51

コードでの74と75のところを変更する必要があります。 例えば行数が97行の場合 以下3パターンの方法があります。 ---- ・シートの入力値から参照した場合 // シートの最終行、97が取得できる // ただし、97行目以降のセルに値が入力されていると // その行数が取得されるので注意 const row = sheet.getLastRow() ---- ・コードで定義した場合 // 反映する行数 // 反映行数が何度も変わる場合、手動での修正が必要 const row = 97 ---- ・特定列の最終行の場合 // A列の最終行 const colRange = "A:A" // 97が取得できる const row = sheet.getRange(`${colRange}${sheet.getRange(colRange).getLastRow()}`).getNextDataCell(SpreadsheetApp.Direction.UP).getLastRow() ---- ・以下共通で修正 sheet.getRange(2, 2, row - 1, 1).getValues().flat() // B2〜B97 // 他の範囲も同様に // 97回繰り返す for (let i = 1; i <= row; i++)
rrr17

2022/07/14 05:46

ありがとうございます。 増やすこともできました。 最後にもう一点お伺いしてもいいでしょうか? B列が空白だった場合はスキップしたいのですがどのようにしたらいいのでしょうか。
k.a_teratail

2022/07/14 06:24

B列のデータはrecipientsにあり recipientで一つずつ取得していると仮定してお答えします。 if (recipient != "") { // 空白ではない時にメール送信 GmailApp.sendEmail() }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問