前提・実現したいこと
Googleフォームが投稿されたら自動でスプレッドシートの内容を拾い、
メール送信されるGASを作成しています。
最初の質問で2分岐いずれかを選択することによって、メールに反映する件名と本文を変えたいです。
「出張」を選んだ場合、件名は「出張の件」、本文はスプレッドシートの2~5列目を、
「会議」を選んだ場合、件名は「会議の件」、本文はスプレッドシートの6~9列目を、
それぞれ挿入したいです。
送信先はいずれも同一です。
発生している問題・エラーメッセージ
if文を挿入すればよいと考え、次のようにコードを書いたのですが、
本文が差し込まれません。
if文をどう入れたらよいか、そもそも分岐の回答をどう定義してよいか
検索していろいろと試したのですが、
Googleフォームの分岐の自動送信をしている例が見当たらず、
お知恵を拝借させてください。
該当のソースコード
function my_update() { var userLock = LockService.getUserLock(); // ユーザに対してLockがかかっているかチェック if (userLock.tryLock(5000)) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheets()[0]; // Lockかけた状態のまま5秒待つ Utilities.sleep(5000); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet_form = ss.getSheetByName("回答"); // スプレッドシート 「回答」シートopen var get_title = sheet_form.getRange("J2:J").getValues(); //タイムスタンプを全部読み込み var rows = sheet_form.getLastRow(); // 最終行の読み込み(フォームに入力されたものは最終行に挿入されるため) var EVENTDAY1_Copy = sheet_form.getRange(1,3); // 出張日時の1行目の計算式をコピー var EVENTDAY2_Copy = sheet_form.getRange(1,7); // 会議日時の1行目の計算式をコピー var To_Copy = sheet_form.getRange(1,14);// 1行目の計算式をコピー var CC_Copy = sheet_form.getRange(1,15);// 1行目の計算式をコピー var ToNAME_Copy = sheet_form.getRange(1,16);// 1行目の計算式をコピー var FromNAME_Copy = sheet_form.getRange(1,17);// 1行目の計算式をコピー for (var j = 2; j <= rows; j++ ) { EVENTDAY1_Copy.copyTo(sheet_form.getRange(j,3)); EVENTDAY2_Copy.copyTo(sheet_form.getRange(j,7)); To_Copy.copyTo(sheet_form.getRange(j,14)); CC_Copy.copyTo(sheet_form.getRange(j,15)); ToNAME_Copy.copyTo(sheet_form.getRange(j,16)); FromNAME_Copy.copyTo(sheet_form.getRange(j,17)); } // 1行目の計算式を最終行まで貼り付け var To_NAME = sheet_form.getRange(rows,14).getValue(); var CC_NAME = sheet_form.getRange(rows,15).getValue(); var TITLE = sheet_form.getRange(rows,1).getValue(); //------------------------------------------------------------ // 設定エリアここから //------------------------------------------------------------ // 件名、本文、フッター var NAME1 = sheet_form.getRange(rows,2).getValue(); var EVENTDAY1 = sheet_form.getRange(rows,3).getValue(); var PLACE1 = sheet_form.getRange(rows,4).getValue(); var PURPOSE1 = sheet_form.getRange(rows,5).getValue(); var NAME2 = sheet_form.getRange(rows,6).getValue(); var EVENTDAY2 = sheet_form.getRange(rows,7).getValue(); var PLACE2 = sheet_form.getRange(rows,8).getValue(); var PURPOSE2 = sheet_form.getRange(rows,9).getValue(); var ToNAME = sheet_form.getRange(rows,16).getValue(); var FromNAME = sheet_form.getRange(rows,17).getValue(); var subject = "申請 "+EVENTDAY1+"/"+NAME1; var body = "ご承認をお願いいたします。\n\n" + "------------------------------------------------------------\n"; var footer = "------------------------------------------------------------\n\n" // メール送信先 var admin = "~~~~@~~~~jp"; // 管理者(必須) var cc = CC_NAME; // Cc: var to = To_NAME; // To: //------------------------------------------------------------ // 設定エリアここまで //------------------------------------------------------------ try{ // スプレッドシートの操作 var sh = SpreadsheetApp.getActiveSheet(); var rows = sh.getLastRow(); var cols = sh.getLastColumn(); var rg = sh.getDataRange(); Logger.log("rows="+rows+" cols="+cols); // メール件名・本文作成と送信先メールアドレス取得 // 最初の質問で答えが「出張」だったら2~5、「会議だったら」6~9を本文に入れるif文 if (TITLE==="どっちにしますか?") { if (rows==="出張") { for (var j = 2; j <= 5; j++ ) { var col_name = rg.getCell(1, j).getValue(); // カラム名 var col_value = rg.getCell(rows, j).getValue(); // 入力値 body += "▼" + col_name + "\n"; body += col_value + "\n\n"; } } else if (rows==="会議") { for (var j = 6; j <= 9; j++ ) { var col_name = rg.getCell(1, j).getValue(); // カラム名 var col_value = rg.getCell(rows, j).getValue(); // 入力値 body += "▼"+col_name+"\n"; body += col_value + "\n\n"; } } body += footer; cc = sheet_form.getRange(rows,15).getValue(); // 送信先オプション var options = {}; if( cc ) options.cc = CC_NAME; var lock = LockService.getUserLock(); if (lock.tryLock(10000)) { try { // メール送信 if ( to ) { MailApp.sendEmail(to, subject, body, options); } } finally { //最期に必ずロックを開放する lock.releaseLock(); } }else{ MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body); } }catch(e){ MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message); } } // Lockの解放 userLock.releaseLock(); rangeLockStatus.setValue("ユーザロック終了"); }
試したこと
・もともとのスクリプトはこちらを参考にして作りました。
https://liapoc.com/new-google-form.html
・上記コードのとおり、if文を使えばよいのかと思いましたが、
elseがエラーと言われるなど、上手く動きませんでした。
https://excel-ubara.com/apps_script1/GAS010.html
補足情報(FW/ツールのバージョンなど)
・分岐がない状態では正常に動作しています。
・Lockは、同時に複数名の方が投稿した際にエラーになることが多かったためにこちらなどを参考にして入れました。問題なく機能していると思っています。
・EVENTDAY1、EVENTDAY2は日時の表記を整えるために、フォームで投稿された状態から数式で変換し直した列を採用するようにコードを書いています。
(2021/01/28→1/28 (木)のように)
回答2件
あなたの回答
tips
プレビュー