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

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

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

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

Q&A

解決済

1回答

1814閲覧

Google Apps Scriptで指定日時にメールを送る方法

gororororo

総合スコア13

Google Apps Script

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

1グッド

2クリップ

投稿2018/12/19 11:04

編集2018/12/19 11:11

前提・実現したいこと

質問欄に「日付項目」「メールアドレス」があるgoogleフォームから回答を送信した際に、入力された日時にメールを送るプログラムを作成しています。

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

メールを送る関数を指定日時に呼び出すまではできているのですが、メールアドレスの取得方法で詰まっています。
メールアドレスを引数で渡す方法、もしくはメールを送る関数の中でメールアドレスを取得する方法、もしくは全く別の方法を教えてもらえたら助かります。よろしくお願いいたします。

該当のソースコード

function setTrigger(e){ var date = String(e.namedValues['日時']); var mail = e.namedValues['メールアドレス']; var value = date.split('/'); var year = value[0]; var month = value[1] - 1; var day = value[2]; var setTime = new Date(); setTime.setFullYear(year); setTime.setMonth(month); setTime.setDate(day); setTime.setHours(10); setTime.setMinutes(00); ScriptApp.newTrigger('sendMail').timeBased().at(setTime).create(); return mail; } function sendMail(mail) { var subject = "件名"; MailApp.sendEmail(mail, subject); }

試したこと

スプレッドシートの最終行から取得しようと考えたのですが、送信したい日時が回答があって5日後だったとしたらその間に新しい回答が来る可能性があるので難しいのかなと、、、

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

bochan2👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

PropertiesServiceを使うか、スプレッドシートから引っ張ってくるかの二択かと思います。
GASまとめ4 - PropertiesService -

投稿2018/12/25 00:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

gororororo

2018/12/25 00:26

ありがとうございます! 試してみます!
退会済みユーザー

退会済みユーザー

2018/12/25 00:30

あ、すみません 二択と言いましたが三択かもですね sendmail関数の中からgoogleフォームのデータを引っ張ることも可能かと思いました。
退会済みユーザー

退会済みユーザー

2018/12/25 01:10

すみません、このやり方で上手く動作しますか? function setTrigger(e){ 〜〜〜〜 function sendmailXXX(){ sendmail(mail); } ScriptApp.newTrigger('sendMailXXX').timeBased().at(setTime).create(); } settriger関数内でsendmailXXXという関数を定義しています。 sendmailXXX内でsendmailにメールアドレスを渡して実行しています。
gororororo

2018/12/25 10:42 編集

ご丁寧にありがとうございます! 3つ目のやり方のみ試しましたが動作しませんでした、、、 ご教示いただいた内容は↓のコードで間違っていませんでしょうか? 残り2つに関してはこれから検証させていただきます! function setTrigger(e){ var date = String(e.namedValues['日時']); var mail = e.namedValues['メールアドレス']; var value = date.split('/'); var year = value[0]; var month = value[1] - 1; var day = value[2]; var setTime = new Date(); setTime.setFullYear(year); setTime.setMonth(month); setTime.setDate(day); setTime.setHours(10); setTime.setMinutes(00); function sendMailParent() { sendMail(mail); } ScriptApp.newTrigger('sendMailParent').timeBased().at(setTime).create(); } function sendMail(mail) { var subject = "件名"; MailApp.sendEmail(mail, subject); }
gororororo

2018/12/25 11:37

PropertiesServiceを使用したところ↓のコードでメールを送ることが出来ました! ありがとうございました!! ただ1つ気がかりなのですが、トリガーの実行数画面で確認したところ、setTrigger関数がずっと実行中で完了にならないのですが、どういったことが考えられるでしょうか? function setTrigger(e){ var date = String(e.namedValues['日時']); var mail = String(e.namedValues['メールアドレス']); var value = date.split('/'); var year = value[0]; var month = value[1] - 1; var day = value[2]; var setTime = new Date(); setTime.setFullYear(year); setTime.setMonth(month); setTime.setDate(day); setTime.setHours(10); setTime.setMinutes(00); var dp = PropertiesService.getDocumentProperties(); dp.setProperty('mail', mail); ScriptApp.newTrigger('sendMail').timeBased().at(setTime).create(); } function sendMail() { var dp = PropertiesService.getDocumentProperties(); var mail = dp.getProperty('mail'); Logger.log(mail); var subject = "件名"; var body = '本文'; MailApp.sendEmail(mail, subject, body); }
退会済みユーザー

退会済みユーザー

2018/12/25 12:54 編集

上記プログラムによってセットされたトリガーの時刻通りにメールが送られた後で まだ実行中だった という意味でしょうか?
gororororo

2018/12/25 12:51

おっしゃる通りです! 本来の質問とズレてしまって申し訳ございません、、、
退会済みユーザー

退会済みユーザー

2018/12/26 15:31

すみません、なぜその動作なのか分からないです。 十分に検証して何が不具合が出ないか確かめることをおすすめします。 ちなみにsendmailXXXという名前をつけてトリガーにセットする方法を自分の方でも試してみましたが、トリガー時刻になるとsendmailXXXという関数が見つかりませんとエラーが来ますね。
退会済みユーザー

退会済みユーザー

2018/12/26 21:23

いま気づいたのですが、この式はまずいですね。 dp.setProperty('mail', mail); これだと他の人がフォームに回答したときにそのメールアドレスが上書きされてしまうのではないでしょうか? 僕なりに考えた結果以下の方法しかないように思えます。 1)1時間毎に発動するトリガーを仕掛ける 2)その時発動する関数によってフォームの全回答内容を調べる。 ひとつひとつ回答をみていく中で回答者が指定した時刻を過ぎているものがあればその人に対してメールを送る。その回答にはメール送信済みのフラグをたてる。
gororororo

2018/12/29 04:53

あ〜なるほど!アドレスの上書きは考えてなかったです、、、 ご教示いただいた方法で実装してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問