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

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

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

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

Q&A

解決済

2回答

5338閲覧

gGAS Gフォームで分岐がある場合の自動送信メールの本文の出し分け方法

kana2hk

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2021/01/12 06:53

編集2021/01/13 06:13

前提・実現したいこと

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 (木)のように)

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

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

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

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

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

papinianus

2021/01/12 16:27

省略しないでもらえますか。省略している部分が正しいことが理解可能なら、丸投げ質問をしなくてすむと思います。 url はリンクにしていただかないと開くのが手間です。
kana2hk

2021/01/13 00:39

ご確認ありがとうございます。 ・省略せずに全文記載いたしました。 ・URLはリンクにしました。 ・Lockは、同時に複数名の方が投稿した際にエラーになることが多かったためにこちらなどを参考にして入れました。問題なく機能していると思っております。プロの方は予測できるものかと、説明が蛇足になるかと思い、省略しました。 ・EVENTDAY1、EVENTDAY2は日時の表記を整えるために、フォームで投稿された状態から数式で変換し直した列を採用するようにコードを書いています。 (2021/01/28→1/28 (木)のように) ・貼り付けたリンクはあくまで参考にしたということでそのまま使用しているとは申しておりませんが、誤解を生みましたら申し訳ございませんでした。 よろしくお願いいたします。
guest

回答2

0

ベストアンサー

  • 望まないかたちであっても↓メールを送ることはできている前提です。多分こうすればいいんじゃないかなーというのを。(こちらでは form やシートの状態は知りようがないので、動作確認が難しいことをご理解ください)

text

1====メール===== 2ご承認をお願いいたします。 3------------------------------------------------------------

javascript

1function my_update() { 2 var userLock = LockService.getUserLock(); 3 // ユーザに対してLockがかかっているかチェック 4 if (userLock.tryLock(5000)) { 5 var ss = SpreadsheetApp.getActiveSpreadsheet(); 6 var sheet = ss.getSheets()[0]; 7 8 // Lockかけた状態のまま5秒待つ 9 Utilities.sleep(5000); 10 11 var ss = SpreadsheetApp.getActiveSpreadsheet(); 12 var sheet_form = ss.getSheetByName("回答"); // スプレッドシート 「回答」シートopen 13 var get_title = sheet_form.getRange("J2:J").getValues(); //タイムスタンプを全部読み込み 14 var rows = sheet_form.getLastRow(); // 最終行の読み込み(フォームに入力されたものは最終行に挿入されるため) 15 var EVENTDAY1_Copy = sheet_form.getRange(1, 3); // 出張日時の1行目の計算式をコピー 16 var EVENTDAY2_Copy = sheet_form.getRange(1, 7); // 会議日時の1行目の計算式をコピー 17 var To_Copy = sheet_form.getRange(1, 14);// 1行目の計算式をコピー 18 var CC_Copy = sheet_form.getRange(1, 15);// 1行目の計算式をコピー 19 var ToNAME_Copy = sheet_form.getRange(1, 16);// 1行目の計算式をコピー 20 var FromNAME_Copy = sheet_form.getRange(1, 17);// 1行目の計算式をコピー 21 for (var j = 2; j <= rows; j++) { 22 EVENTDAY1_Copy.copyTo(sheet_form.getRange(j, 3)); 23 EVENTDAY2_Copy.copyTo(sheet_form.getRange(j, 7)); 24 To_Copy.copyTo(sheet_form.getRange(j, 14)); 25 CC_Copy.copyTo(sheet_form.getRange(j, 15)); 26 ToNAME_Copy.copyTo(sheet_form.getRange(j, 16)); 27 FromNAME_Copy.copyTo(sheet_form.getRange(j, 17)); 28 }                                // 1行目の計算式を最終行まで貼り付け 29 var To_NAME = sheet_form.getRange(rows, 14).getValue(); 30 var CC_NAME = sheet_form.getRange(rows, 15).getValue(); 31 var TITLE = sheet_form.getRange(rows, 1).getValue(); 32 33 34 //------------------------------------------------------------ 35 // 設定エリアここから 36 //------------------------------------------------------------ 37 38 // 件名、本文、フッター 39 var NAME1 = sheet_form.getRange(rows, 2).getValue(); 40 var EVENTDAY1 = sheet_form.getRange(rows, 3).getValue(); 41 var PLACE1 = sheet_form.getRange(rows, 4).getValue(); 42 var PURPOSE1 = sheet_form.getRange(rows, 5).getValue(); 43 var NAME2 = sheet_form.getRange(rows, 6).getValue(); 44 var EVENTDAY2 = sheet_form.getRange(rows, 7).getValue(); 45 var PLACE2 = sheet_form.getRange(rows, 8).getValue(); 46 var PURPOSE2 = sheet_form.getRange(rows, 9).getValue(); 47 var ToNAME = sheet_form.getRange(rows, 16).getValue(); 48 var FromNAME = sheet_form.getRange(rows, 17).getValue(); 49 var subject = "申請 " + EVENTDAY1 + "/" + NAME1; 50 var body 51 = "ご承認をお願いいたします。\n\n" 52 + "------------------------------------------------------------\n"; 53 var footer 54 = "------------------------------------------------------------\n\n" 55 56 // メール送信先 57 var admin = "~~~~@~~~~jp"; // 管理者(必須) 58 var cc = CC_NAME; // Cc: 59 var to = To_NAME; // To: 60 //------------------------------------------------------------ 61 // 設定エリアここまで 62 //------------------------------------------------------------ 63 try { 64 // スプレッドシートの操作 65 var sh = SpreadsheetApp.getActiveSheet(); 66 var rows = sh.getLastRow(); 67 var cols = sh.getLastColumn(); 68 var rg = sh.getDataRange(); 69 Logger.log("rows=" + rows + " cols=" + cols); 70 71 // メール件名・本文作成と送信先メールアドレス取得 72 // 最初の質問で答えが「出張」だったら2~5、「会議だったら」6~9を本文に入れるif文 73 if (TITLE === "出張") { 74 for (var j = 2; j <= 5; j++) { 75 var col_name = rg.getCell(1, j).getValue(); // カラム名 76 var col_value = rg.getCell(rows, j).getValue(); // 入力値 77 body += "▼" + col_name + "\n"; 78 body += col_value + "\n\n"; 79 } 80 } else if (TITLE === "会議") { 81 for (var j = 6; j <= 9; j++) { 82 var col_name = rg.getCell(1, j).getValue(); // カラム名 83 var col_value = rg.getCell(rows, j).getValue(); // 入力値 84 body += "▼" + col_name + "\n"; 85 body += col_value + "\n\n"; 86 } 87 } 88 body += footer; 89 cc = sheet_form.getRange(rows, 15).getValue(); 90 91 // 送信先オプション 92 var options = {}; 93 if (cc) options.cc = CC_NAME; 94 var lock = LockService.getUserLock(); 95 if (lock.tryLock(10000)) { 96 try { 97 // メール送信 98 if (to) { 99 MailApp.sendEmail(to, subject, body, options); 100 } else { 101 MailApp.sendEmail(admin, "【失敗】Googleフォームにメールアドレスが指定されていません", body); 102 } 103 } finally { 104 //最期に必ずロックを開放する 105 lock.releaseLock(); 106 } 107 } 108 } catch (e) { 109 MailApp.sendEmail(admin, "【失敗】Googleフォームからメール送信中にエラーが発生", e.message); 110 } 111 // Lockの解放 112 userLock.releaseLock(); 113// rangeLockStatus.setValue("ユーザロック終了"); 114 } 115}

投稿2021/01/12 16:39

編集2021/01/13 13:44
papinianus

総合スコア12705

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

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

kana2hk

2021/01/13 00:42

ありがとうございます。 いただいたご指摘とコードで修正し、「TITLE」を定義すればよいのではないかと 「var TITLE = sheet_form.getRange(rows,1).getValue();」を入れて動かしてみたのですが、 自動送信されたメールには、本文以下が挿入されませんでした。 もしわたしの拙い文章でお気を悪くされてしまったのでしたら申し訳ございません。 ヒントがございましたら頂けましたら幸いです。
papinianus

2021/01/13 03:23 編集

余力のあるときに拝見しますが、特に気は悪くしていません。もったいないと感じています。 私も質問者さまも動くものが欲しいのだと思います(このサイトはたまに回答者を困らせてやろうという方がいらっしゃるので難しいですが)。もしこの仮定が正しいなら、わからないことは分からないまま全て示して、どうなったら動いたことになるのかを明確化することをおすすめします。
kana2hk

2021/01/13 06:08

昨日今日始めたばかりで、何もわかっておらず、申し訳ございません。 今一度わからないことを記載します。 ・どうなったら動いたことになるのか、というのは、自動送信メールに本文まで含まれて送信される状態を目指しています。 ====メール===== ご承認をお願いいたします。 ------------------------------------------------------------ ▼名前 ○○ ▼予定日 1/12 (火) ▼場所 ○○ ▼理由 ○○ ------------------------------------------------------------ ・if文の中で、フォームの質問1の最終行の値を以て分岐をしたいのですが、  その指定方法が理解できていないように思います。  設定エリア前に  「 var TITLE = sheet_form.getRange(rows,1).getValue();」を入れることで、  1つ目のカラムは質問(TITLE)ですよと指定し、  設定エリア内のif文前の「// スプレッドシートの操作」で「var rows = sh.getLastRow();」は最終行の値ですよ、と宣言しているように見えたので、    if文で「if (rows==="出張") {」と記載すれば、  質問カラムの最終行の値を以て分岐してね、という意味になるのではないかと試した次第です。  が、メールは以下のようになってしまいました。 ====メール===== ご承認をお願いいたします。 ------------------------------------------------------------
kana2hk

2021/01/14 04:37

ありがとうございます!ご指摘のとおり、if文が下記の通り誤っていました。 無事に分岐動作いたしました。 複雑に考えすぎてしまっていたようです。 お忙しいところご丁寧に本当にありがとうございました、大変助かりました。 もっと勉強したいと思います。
guest

0

備忘録

誤) 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"; }
正) if (TITLE === "出張") { 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 (TITLE === "会議") { 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"; }

投稿2021/01/14 04:38

kana2hk

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問