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

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

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

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

Q&A

解決済

1回答

2717閲覧

GASでフォーム送信時にGoogleカレンダーへの反映とフォームが送信されたことを知らせるメールを送るスクリプトを作りたい

mutttttton

総合スコア15

Google Apps Script

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

0グッド

1クリップ

投稿2018/10/05 09:47

編集2018/10/09 06:00

前提・実現したいこと

Google Apps Scriptを使ってフォームの送信時にその内容をGoogleカレンダーに反映させて
フォームが送信されたことを知らせるメールを送れるようにしたいです。
当方独学の初心者です。

フォームの内容は、店の予約のようなもので
質問は、名前、日時、時間、場所、詳細の5項目です。
場所は、ラジオボタンで2択にしていて、仮にaaaとbbbとします。
場所ごとに担当者がいて、aaaを選択したら、aaaの担当者4名にメールが行くようにしたいです。

カレンダーは共有のものをしようしていますので、1つだけ反映されれば問題ありません。
欲を言えば、カレンダーの招待メールを送りたいところですが、
GASの仕様上、未対応?のようなことを見かけたので共有のカレンダーを使用しています。

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

フォーム送信時にエラーメッセージは出ませんが、
カレンダーにもメールの送信もされません。
いろいろと調べながら作っていたので
そもそもコード自体が間違っている可能性は大いにありますが、
どこをなおしていいものかわからず、大変困っています。

該当のソースコード

function sendToCalendar(e) { //有効なGoogleスプレッドシートを開く var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var dat = sheet.getRange().getValue(); //ゲストを設定 var aaag = "aaa@aaa.co.jp,bbb@aaa.co.jp,ccc@aaa.co.jp,ddd@aaa.co.jp" var bbbg = "aaa@bbb.co.jp,bbb@bbb.co.jp,ccc@bbb.co.jp,ddd@bbb.co.jp" //追加された行番号を取得 var num_row = sheet.getLastRow(); //追加された行から名前を取得 var nname = dat[num_row][1]; //追加された行から場所を取得 var loc = dat[num_row][4] //詳細欄の取得 var des = dat[num_row][5]; //予約を記載するカレンダーを取得 if(loc =="aaa"){ id="aaa@google.com"; guest=aaag;} else if(loc =="bbb"){ id="bbb@google.com"; guest=bbbg;} var cals = CalendarApp.getCalendarById(id); /* 日時をセット */ var evtDate = new Date(dat[i][2]); var evtTime = new Date(dat[i][3]); evtDate.setHours(evtTime.getHours()); evtDate.setMinutes(evtTime.getMinutes()); //予約情報をカレンダーに追加 thisevent = cals.createEvent(nname, evtDate, evtDate,{location: loc, description: des, guests:(guest), sendinvite: true}); //メールの送信 var to = (guest); var sub = "タイトル" var body="本文"; MailApp.sendEmail({to:to,subject:sub,body:body}) }

試したこと

同時に行うのがダメなのかと思い、カレンダーへの反映とメール送信それぞれ単体でスクリプトを作り
試しましたが、その時はうまくいきました。

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

不足している情報がございましたら、ご指摘いただけますと幸いです。
宜しくお願い致します。

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

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

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

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

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

hotta

2018/10/07 03:27

ソースコードを組み込んだ Google Form / Calendar / 自体を公開すれば、回答者が環境を作らなくてすむのでレスが付きやすいかもしれません。 ただその場合、実行すると実際にメールが送られる可能性があり受信者に迷惑がかかるので、実在するドメインを記載してはなりません。例示するドメインは example.com 等、サンプルで使うべきドメインに書き換えてください。 https://ja.wikipedia.org/wiki/Example.com
guest

回答1

0

ベストアンサー

いくつかの点で不備がある点を修正すれば、メールとカレンダーの両方が動作しました
6行ほど修正していますので、確認してください。
なお(guest)という表記については、こちらでは正しい直し方がわからないため、下記をコピペしても動作しません。きちんと6行分目を通してください。

javascript

1function sendToCalendar(e) { 2 //有効なGoogleスプレッドシートを開く 3 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 4 var dat = sheet.getDataRange().getValues(); //getRange,getValueを←のように修正 5 //ゲストを設定 6 var aaag = "aaa@aaa.co.jp,bbb@aaa.co.jp,ccc@aaa.co.jp,ddd@aaa.co.jp" 7 var bbbg = "aaa@bbb.co.jp,bbb@bbb.co.jp,ccc@bbb.co.jp,ddd@bbb.co.jp" 8 9//追加された行番号を取得 10 var num_row = sheet.getLastRow() - 1; //配列は0からはじまるためここで-1する必要があります。 11 12//追加された行から名前を取得 13 var nname = dat[num_row][1]; 14 15//追加された行から場所を取得 16 var loc = dat[num_row][4] 17 18 //詳細欄の取得 19 var des = dat[num_row][5]; 20 21//予約を記載するカレンダーを取得 22 var guest =""; 23 if(loc =="aaa"){ 24 id="aaa@google.com"; 25 guest=aaag;} 26 else if(loc =="bbb"){ 27 id="bbb@google.com"; 28 guest=bbbg;} 29 var cals = CalendarApp.getCalendarById(id); 30 31 /* 日時をセット */ 32 var evtDate = new Date(dat[num_row][2]); //iは存在しないので、num_rowに修正 33 var evtTime = new Date(dat[num_row][3]); //iは存在しないので、num_rowに修正 34 evtDate.setHours(evtTime.getHours()); 35 evtDate.setMinutes(evtTime.getMinutes()); 36 37//予約情報をカレンダーに追加 38 thisevent = cals.createEvent(nname, evtDate, evtDate,{location: loc, description: des, guests:guest, sendinvite: true}); //ここの(guest)をこのまま放置すると動作しません。 39//メールの送信 40 var to = guest; //ここも(guest)のまま放置すると動作しません。 41 var sub = "タイトル" 42 var body="本文"; 43 MailApp.sendEmail({to:to,subject:sub,body:body}) 44 }

num_rowとの関連になるのですが、配列は0からはじまります。
そのため、例えばlocをdat[num_row][4]としておられますが、これはE列に該当します(D列ではないです)。A列なら0,B列なら1です。2,3,4,5が出てきますが特に2,3はカレンダーの日時になり、これが列がずれていると動作しないと思いました。
C列に日付、D列に時間が正しく設定されていれば、フォームから送信時のトリガーでメールとカレンダーが両方登録されるという期待通りの結果を得ることができました。

投稿2018/10/10 08:37

編集2018/10/19 06:19
papinianus

総合スコア12705

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

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

mutttttton

2018/10/11 01:43

ご回答ありがとうございます! 早速試してみたいところですが、私が編集できない環境におり来週までおあずけなのが非常に残念です。 guestの部分でまた悩むかもしれませんが、一度やってみたいと思います。
papinianus

2018/10/11 05:43

カレンダーのゲストについては何を入れたいのか想像できません。やりたいことがわかれば方針は提示できるかも。 メールのtoは固定だと思うので単に"me@example.com"など正しいアドレスを書けばよいはずです。"を忘れずに。
mutttttton

2018/10/19 04:16

返信が遅れて申し訳ありません。 カレンダー取得のところでゲストも取得したかったのです。 locがaaaの時、カレンダーのidはaaa.google.com/カレンダーのゲストにaaagの4名(6行目)に。メールの送信もaaagの4名に送れるようにしたかったのです。 bbbの時は、同様にbbbgへといった感じに分けたいのですが、 何かいい案はございませんでしょうか。 よろしくお願いいたします。
papinianus

2018/10/19 06:21

aaagとかbbbgとか変数ごと無視してしまっておりました。guestの宣言(var)を置いて改訂しました。ご確認ください
mutttttton

2018/10/19 07:48

ご回答ありがとうございます。 完璧に動作しました。 本当にたすかりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問