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

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

詳細はこちら
Google Apps Script

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

Q&A

1回答

1898閲覧

if~else が同時実行される

yoyoy

総合スコア14

Google Apps Script

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

0グッド

2クリップ

投稿2019/11/11 07:03

編集2019/11/11 07:10

現在、Formから予約受付を行い、カレンダー・スプレッドシートと連携をさせた会議室予約受付を作成します。

Formから予約があったら、カレンダーに先約が入っていないか確認をし、入っていない場合はそのままカレンダーとスプレッドシートに追記し、仮予約受付メールの送信ができるようにしました。
先約が入っている場合はカレンダーとスプレッドシートに追記せず、先約が入っているため再度予約をし直して下さいのメールを送るようにしました。

if~elseの条件分岐で作成しています。

2週間前に実行をした際は、正常に動いていたのですが、最終チェックとして先週再度実行を行ったところ、カレンダーに予約が入っていない場合、本来なら、ifに設定したスクリプトのみが実行されるはずなのですが、elseに設定したスクリプトも実行されてしまうようになりました。
ifもelseも実行され、「仮予約受付メール」と「先約が入っているため再度予約をし直して下さい」のメールが同時に送信され、スプレッドシートは何も追記がされなくなっています。
しかし、カレンダーには予定が入った状態となっています。

カレンダーにすでに予約を入れ、再度、同じ日時でFormから申請を行うと、elseのスクリプトのみがきちんと実行されます。

カレンダーの再作成を行たっり、再度スクリプトも作成しなおしてみたのですが、原因がわかりません。
どなたか、同じ現象になった方で解決方法をご存知の方がいらっしゃったら、宜しくお願い致します。

function sendToCalendar(e) { //有効なGooglesプレッドシートを開く var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //新規予約された行番号を取得 var num_row = sheet.getLastRow(); //新規予約された行から名前を取得 var nname = sheet.getRange(num_row, 3).getValue(); //メールアドレスの取得 var nmail = sheet.getRange(num_row,2).getValue(); //予約の利用用途を取得 var youto = sheet.getRange(num_row, 11).getValue(); //予約の場所を取得 var space = sheet.getRange(num_row, 12).getValue(); //予約の機器を取得 var kiki = sheet.getRange(num_row, 10).getValue(); //予約の人数を取得 var people = sheet.getRange(num_row, 9).getValue(); //予約を記載するカレンダーを取得 var cals = CalendarApp.getCalendarById("カレンダーID"); //予約の開始時間を取得 var stime = new Date(sheet.getRange(num_row, 7).getValue()); var stime2 = sheet.getRange(num_row, 7).getDisplayValues(); //予約の終了時間を取得 var etime = new Date(sheet.getRange(num_row, 8).getValue()); var etime2 = sheet.getRange(num_row, 8).getDisplayValues(); //予約日を取得 var ndate = new Date(sheet.getRange(num_row, 6).getValue()); var ndate2 = sheet.getRange(num_row, 6).getDisplayValues(); var ndates= new Date(ndate.getFullYear(),ndate.getMonth(),ndate.getDate(),stime.getHours(),stime.getMinutes(),0); var ndatee= new Date(ndate.getFullYear(),ndate.getMonth(),ndate.getDate(),etime.getHours(),etime.getMinutes(),0); var option = { description : nname +'、'+ kiki +'、'+ people+'人', location : space } // 先約があるかどうか調べる if(cals.getEvents(ndates, ndatee) == 0 ){ var thing = youto ; //予約情報をカレンダーに追加 var r = cals.createEvent(thing, ndates, ndatee, option); var subject = "仮予約"; var body =''; body += '申請ありがとうございます。\n'; body += '仮予約を受付致しました。\n'; body += '\n'; body += '【申請内容】\n'; body += ' ・申請者名 : ' + nname + '\n'; body += ' ・予約日 : ' + ndate2 + '\n'; body += ' ・開始時間 : ' + stime2 + '\n'; body += ' ・終了時間 : ' + etime2 + '\n'; body += ' ・利用用途 : ' + youto + '\n'; body += ' ・場所 : ' + space + '\n'; body += ' ・人数 : ' + people + "人" + '\n'; body += ' ・利用機材 : ' + kiki + '\n'; body += '\n'; body += '予約確定次第、再度のこメールアドレスにご連絡致します。'; GmailApp.sendEmail(nmail,subject,body, { from: 'メールアドレス',   name: 'XXXXXXXXX',}); var subject2 = "受付をお願い致します。"; var body2 =''; body2 += '予約申請の仮予約がありました。\n'; body2 += '受付をお願いします。\n'; body2 += '\n'; body2 += '以下のURLから詳細をご確認下さい。\n'; body2 += '\n'; body2 += '【詳細確認と承認はこちら】\n'; body2 += 'https://docs.google.・・・・ '; GmailApp.sendEmail('メールアドレス',subject2,body2, { from: 'メールアドレス',   name: 'XXXXXXXXXX',}); } else{ sheet.deleteRow(num_row); var body3 =''; body3 += 'ご予約の時間に先約がありましたので、\n'; body3 += '申し訳ございませんが、ご予約いただけませんでした。\n'; body3 += '\n'; body3 += '再度お申込みください。\n'; body3 += '\n'; body3 += '【ご予約はこちら】\n'; body3 += ' https://・・・・・ ' ; body3 = nname+" 様\n\n"+body3; GmailApp.sendEmail(nmail,"ご予約できませんでした",body3, { from: 'メールアドレス',   name: 'XXXXXXXX',}); } }

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

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

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

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

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

dodox86

2019/11/11 07:35

> ifもelseも実行され GASについて、さすがにそんな致命的な言語のバグは無いような気がしますが、スクリプトを拝見しますと、elseの付近、’’でくくる文字列ではない部分に全角の空白文字が入っています。それで何かおかしいことになっているかもしれません。 > GmailApp.sendEmail('メールアドレス',subject2,body2, > { > from: 'メールアドレス', > □□name: 'XXXXXXXXXX',}); ^^^^ここ } GmailApp.sendEmailを実行している2か所で上記のようになっていますが、この2か所を正しく直してみてください。また、他にもないか確認してみてください。
otn

2019/11/11 07:57

> 本来なら、ifに設定したスクリプトのみが実行されるはずなのですが、elseに設定したスクリプトも実行されてしまうようになりました。 それはあり得ないので、あり得ない前提で、もう一度状況を確認するのが良いと思います。
yoyoy

2019/11/11 08:30

ご確認頂きましてありがとうございます。 全角の部分を削除しましたが、改善されませんでした。 他も確認してみようと思います。
guest

回答1

0

トリガー実行は、非常に短い時間で複数回実行される事があったりします。

もしかしたらフォーム送信時、短時間で二回実行し、一回目でtrue文が動き、2回目でelse文が動いていたりしないでしょうか?

もしそういう問題の場合は
Google Apps Script で二重起動を防止する

これで解決する可能性もあります。

一度トライしてみては如何でしょうか。


後一応気になったのですが、スプレッドシートに記載されないとの事ですが、
どこにスプレッドシートへ貼り付ける文があるのでしょうか?
フォームからの自動送信と、setValueぐらいしか貼り付ける方法がないと思っていたので、
追記していただけるとほかの方の回答の参考になるかもしれません。

投稿2019/11/11 14:07

編集2019/11/11 14:16
takaD

総合スコア315

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

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

papinianus

2019/11/12 00:33

本質的にはこの回答の複数回の実行されても耐えられる設計にするしかないを支持するのでこちらにお邪魔します。 別種の回避策としてFormのスクリプトとしてonSubmitトリガーにすると一度しか実行されないようです。 takaDさまの時間トリガーの短時間発火の発火は今回初めて接しましたが、teratailではある時期から、Formの送信トリガーをスプレッドシートのスクリプトで受けたときに、次の事例が報告されてきています。 ・複数回発火。 ・複数回発火時にイベントパラメータから回答データがとれない。 ・シートの最終行に反映されてないため今回の質問のようなコードで古いデータをとってしまう(反映までの時間もかなりぶれがある) 過去の質問やネット検索して出てくるサンプルと比較すると、現状そういう仕様に変わったと考えるのが妥当なようで、その前提で自力で対応するほかなさそうです
yoyoy

2019/11/12 07:11

回答ありがとうございます。 二重起動を防止するを行ってみましたが、うまく動きませんでした。 もしかしたら、わたしの設定が間違っていた可能性あるかもしれませんが。。。 以前から作成していた別のスクリプトのif~elseが実行できてないことが今日わかりました。 幸い、このスクリプトは別の条件式で対応することができました。 今回投稿したスクリプトも別の条件式で対応をしてみようと思います。 投稿したものは、まだ稼働前でもあるので、少し時間が経ってから再度確認もしてみようと思っています。 同じ現象になっている方がいたら、是非教えて頂きたいため、引き続き回答をお待ちしております。
yoyoy

2019/11/12 07:13

別種の回避策としてFormのスクリプトとしてonSubmitトリガーをまだ、確認していないため、その設定で確認もしてみようと思います。
papinianus

2019/11/12 11:08 編集

他人の回答だったので削除
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問