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

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

ただいまの
回答率

89.21%

if~else が同時実行される

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 297

yoyoy

score 6

現在、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',});
 }
 }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dodox86

    2019/11/11 16:35

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

    キャンセル

  • otn

    2019/11/11 16:57

    > 本来なら、ifに設定したスクリプトのみが実行されるはずなのですが、elseに設定したスクリプトも実行されてしまうようになりました。

    それはあり得ないので、あり得ない前提で、もう一度状況を確認するのが良いと思います。

    キャンセル

  • yoyoy

    2019/11/11 17:30

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

    キャンセル

回答 1

+1

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

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

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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/12 09:33

    本質的にはこの回答の複数回の実行されても耐えられる設計にするしかないを支持するのでこちらにお邪魔します。

    別種の回避策としてFormのスクリプトとしてonSubmitトリガーにすると一度しか実行されないようです。

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

    キャンセル

  • 2019/11/12 16:11

    回答ありがとうございます。
    二重起動を防止するを行ってみましたが、うまく動きませんでした。
    もしかしたら、わたしの設定が間違っていた可能性あるかもしれませんが。。。

    以前から作成していた別のスクリプトのif~elseが実行できてないことが今日わかりました。
    幸い、このスクリプトは別の条件式で対応することができました。

    今回投稿したスクリプトも別の条件式で対応をしてみようと思います。
    投稿したものは、まだ稼働前でもあるので、少し時間が経ってから再度確認もしてみようと思っています。

    同じ現象になっている方がいたら、是非教えて頂きたいため、引き続き回答をお待ちしております。

    キャンセル

  • 2019/11/12 16:13

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

    キャンセル

  • 2019/11/12 20:01 編集

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

    キャンセル

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

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる