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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Q&A

解決済

3回答

2142閲覧

Google Apps Script でスプレッドシートの文字を利用する

sazami

総合スコア18

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

0グッド

0クリップ

投稿2019/03/29 14:03

前提・実現したいこと

Googleフォームからお申込みがあったら、自動返信をするスクリプトをGoogleフォーム側で設定をしておりますが、毎月日にちを修正するのに手間がかかるため、スプレッドシート内にある日付を自動取得して利用したいと思っております。
動作としては、該当申込日が定員に達しているかを判定し、返信メール内で「〇月〇日に受付いたしました」「〇月〇日は定員に達していますので受付できません」と記載して返信を行います。
定員に達しているかどうかの判定は正しく動作しておりますが、日付を代入して利用する方法がわかりません。
コード内 if (answer == '5月16日'){ 部分の6ヶ所を毎月手入力しております。
ご教授いただけると助かります。よろしくお願い致します。

該当のソースコード

GAS

1function submitForm(e){ 2 var itemResponses = e.response.getItemResponses(); 3 var message = ''; 4 var username = ''; 5 var h1 = ''; 6 var h2 = ''; 7 var K = ''; 8 var mail = ''; 9 for (var i = 0; i < itemResponses.length; i++) { 10 var itemResponse = itemResponses[i]; 11 var question = itemResponse.getItem().getTitle(); 12 var answer = itemResponse.getResponse(); 13 if (question == 'お名前'){ 14 username = answer; 15 } 16 if (question == 'メールアドレス'){ 17 mail = answer; 18 } 19 k=''; 20 h1=''; 21 if (question == '申込日'){ 22 if (answer == '5月16日'){ 23 h1=nsu1() 24 if ( h1 <= 0 ){ 25 k='は定員に達していますので受付できません。'; 26 } else { 27 k='に受付いたしました'; 28 } 29 } 30 if (answer == '5月21日'){ 31 h1=nsu2() 32 if (h1 <= 0 ){ 33 k='は定員に達していますので受付できません。'; 34 } else { 35 k='に受付いたしました'; 36 } 37 } 38 if (answer == '5月30日'){ 39 h1=nsu3() 40 if (h1 <= 0 ){ 41 k='は定員に達していますので受付できません。'; 42 } else { 43 44 k='に受付いたしました'; 45 } 46 } 47 } 48 49 if (question == '申込日2'){ 50 if (answer == '5月16日'){ 51 h1=nsu1() 52 if ( h1 <= 0 ){ 53 k='は定員に達していますので受付できません。'; 54 } else { 55 k='に受付いたしました'; 56 } 57 } 58 if (answer == '5月21日'){ 59 h1=nsu2() 60 if (h1 <= 0 ){ 61 k='は定員に達していますので受付できません。'; 62 } else { 63 k='に受付いたしました'; 64 } 65 } 66 if (answer == '5月30日'){ 67 h1=nsu3() 68 if (h1 <= 0 ){ 69 k='は定員に達していますので受付できません。'; 70 } else { 71 k='に受付いたしました'; 72 } 73 } 74 } 75 76 77 message = message + '. ' + question + ': ' + answer + k + '\n'; 78 } 79 80 var title2 = 'お申込みありがとうございます'; 81 var content2 = username + '様\n\nお申込ありがとうございます。\n' 82 + '※このメールはお申込みをいただいた方に自動送信されます。\n\n' 83 + message; 84 MailApp.sendEmail(mail, title2, content2); 85} 86 87function nsu1(){ 88 var ur1="https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; 89 var spreadsheet = SpreadsheetApp.openByUrl(ur1); 90 var sheets = spreadsheet.getSheets(); 91 for ( var i in sheets ){ 92 if ( sheets[i].getSheetName() == "申込人数" ) { 93 var data1 = sheets[i].getSheetValues(2, 5, 1, 1); 94 } 95 } 96 return data1; 97 } 98 99 function nsu2(){ 100 var ur1="https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; 101 var spreadsheet = SpreadsheetApp.openByUrl(ur1); 102 var sheets = spreadsheet.getSheets(); 103 for ( var i in sheets ){ 104 if ( sheets[i].getSheetName() == "申込人数" ) { 105 var data2 = sheets[i].getSheetValues(3, 5, 1, 1); 106 } 107 } 108 return data2; 109 } 110 111 function nsu3(){ 112 var ur1="https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; 113 var spreadsheet = SpreadsheetApp.openByUrl(ur1); 114 var sheets = spreadsheet.getSheets(); 115 for ( var i in sheets ){ 116 if ( sheets[i].getSheetName() == "申込人数" ) { 117 var data3 = sheets[i].getSheetValues(4, 5, 1, 1); 118 } 119 } 120 return data3; 121 } 122

スプレッドシート

左から3番目の「申込人数」シート A列の日にちを自動取得したい
|日にち|申込人数|定員||満席判定|
|:--|:--:|--:|
|2019/05/16|5|50||45|
|2019/05/21|4|50||46|
|2019/05/30|5|50||45|

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

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

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

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

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

guest

回答3

0

他所様のコメントについたコードですが、直すとこう。

function submitForm(e){ var itemResponses = e.response.getItemResponses(); var message = ''; var username = ''; var h1 = ''; var h2 = ''; var K = ''; var mail = ''; for (var i = 0; i < itemResponses.length; i++) { var itemResponse = itemResponses[i]; var question = itemResponse.getItem().getTitle(); var answer = itemResponse.getResponse(); if (question == 'お名前'){ username = answer; } if (question == 'メールアドレス'){ mail = answer; } message = message + '. ' + question + ': ' + answer; if (question == '申込日'){ var k = nsu(answer); message = message + k; } if (question == '申込日2'){ var k2 = nsu(answer); message = message + k2; } message = message + '\n'; } var title2 = 'お申込みありがとうございます'; var content2 = username + '様\n\nお申込ありがとうございます。\n' + '※このメールはお申込みをいただいた方に自動送信されます。\n\n' + message; MailApp.sendEmail(mail, title2, content2); } function nsu(answer) { //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します var ur1="https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; var spreadsheet = SpreadsheetApp.openByUrl(ur1); var sheet = spreadsheet.getSheetByName('申込人数'); var range = sheet.getRange(2,1,3,5); k=''; h1=''; for(i=2;i<=4;i++){ //i行目の日にちを取得する var date = sheet.getSheetValues(i, 1, 1, 1); //2行目の日にちと入力された日にちが一緒なら if(date == answer ){ //i行目の満席判定を取得する h1 = sheet.getSheetValues(i, 5, 1, 1); //i行目の満席判定がマイナスなら if ( h1 <= 0 ){ k='は定員に達していますので受付できません。'; //i行目の満席判定がプラスなら } else { k='に受付いたしました'; } } } return k; }

original

javascript

1function submitForm(e){ 2 var itemResponses = e.response.getItemResponses(); 3 var message = ''; 4 var username = ''; 5 var h1 = ''; 6 var h2 = ''; 7 var K = ''; 8 var mail = ''; 9 for (var i = 0; i < itemResponses.length; i++) { 10 var itemResponse = itemResponses[i]; 11 var question = itemResponse.getItem().getTitle(); 12 var answer = itemResponse.getResponse(); 13 if (question == 'お名前'){ 14 username = answer; 15 } 16 if (question == 'メールアドレス'){ 17 mail = answer; 18 } 19 20 function nsu(){ 21 //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します 22 var ur1="https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; 23 var spreadsheet = SpreadsheetApp.openByUrl(ur1); 24 var sheet = spreadsheet.getSheetByName('申込人数'); 25 var range = sheet.getRange(2,1,3,5); 26 return data; 27 k=''; 28 h1=''; 29 for(i=2;i<=4;i++){ 30 31 //i行目の日にちを取得する 32 var date = sheets.getSheetValues(i, 1, 1, 1); 33 34 //2行目の日にちと入力された日にちが一緒なら 35 if(date == answer ){ 36 37 //i行目の満席判定を取得する 38 h1 = sheets.getSheetValues(i, 5, 1, 1); 39 40 //i行目の満席判定がマイナスなら 41 if ( h1 <= 0 ){ 42 k='は定員に達していますので受付できません。'; 43 44 //i行目の満席判定がプラスなら 45 } else { 46 k='に受付いたしました'; 47 } 48 } 49 } 50 51 message = message + '. ' + question + ': ' + answer + k + '\n'; 52 } 53 54 var title2 = 'お申込みありがとうございます'; 55 var content2 = username + '様\n\nお申込ありがとうございます。\n' 56 + '※このメールはお申込みをいただいた方に自動送信されます。\n\n' 57 + message; 58 MailApp.sendEmail(mail, title2, content2); 59 } 60}

投稿2019/04/01 13:49

編集2019/04/03 05:39
papinianus

総合スコア12705

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

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

papinianus

2019/04/01 16:13

> 説明不足で申し訳なかったのですが、申込日と申込日2があり、それぞれ同じ日付の3日間がフォームに登録されており、応募者は申込日と申込日2の2日間を選択できます。 申込日と申込日2のそれぞれに対してメールで回答を自動返信したいので、 if (question == '申込日')...以下 部分をコピーし、'申込日'→'申込日2'に 申込日はnsu1(answer)に申込日2はnsu2(answer)にし、 function nsu(answer) {..以下もコピーしてnsu1、nsu2としてみましたが、submitFormも実行されていない状態になってしまいました。 そんな単純な事ではできなかったようです。 dett様の回答からの展開を見る限り、質問者様がコピーをすると関数のブロック({と}の範囲)がおかしくなるようです。 formの送信時に、「アンケート」という設問があり、その回答を埋めているのに「受信者が指定されていません」となるのは、このためです。 申し込み2に対応した改訂を行いましたので、こちらでご確認ください。
papinianus

2019/04/01 16:16

ちがうと思いますが、やりたいのは「2通のメール」を送信することですか? また、動作検証をしたのであれば「申込日」だけについて正常な応答ができているのか(その上で「2」にトライしたのか)、できていないのか、「申込日」だけではそもそも足りないからいきなり「2」を入れたのか、など、何をしてどうなったを書いていただきたいです。
sazami

2019/04/01 16:48

失礼しました。いえ、2通のメールではなく1通のメールに2日分の解答を記載する事です。 動作検証は「申込日」だけでやった時には「受信者が指定されていません at submitForm(コード:28)」となり、2を追加してトライしたらsubmitFormも実行されずの状態になりました。 申し込み2に対応したコードの改訂ありがとうございます。 試してみましたが「受信者が指定されていません at submitForm(コード:32)」になってしまいました。 関数のブロック({と}の範囲)がおかしくなるようです。←のコメントについてですが、目視で確認しても記載したいただいたコードとの相違はありませんでした。
papinianus

2019/04/01 23:45

申込2を入れる前の時点で、そのエラーになるなら、質問に「メールアドレス」という設問があって、そこの欄にメールアドレスが書いてあるか、が疑われるのですが、ありますか?
sazami

2019/04/02 11:16

はい、メールアドレスの項目は必須なので、間違いなく入っております。 申込2を入れる前の状態でもsubmitFormエラーでしたので、 var title2 = 'お申込みありがとうございます'; var content2 = username + '様\n\nお申込ありがとうございます。\n' + '※このメールはお申込みをいただいた方に自動送信されます。\n\n' + message; MailApp.sendEmail(mail, title2, content2); } } ↑部分の }1つをvar title2 = の上に移動してみたところ、メールは届きましたが、内容が下記のように ------------------------------------------------------------------------ 〇〇様 お申込ありがとうございます。 ※このメールはお申込みをいただいた方に自動送信されます。 . 申込日: 5月16日 ------------------------------------------------------------------------ のみで、満席か否かのコメントはなく、また他にフォームでの入力項目の .お名前. ふりがな. 住所. 電話番号. メールアドレス. 性別. 生年月日 の記載もない状態です。 コードを変更する前は、入力項目が全て入った状態で届いておりました。
sazami

2019/04/02 13:23

追加でコメントさせて頂きます。 if (question == '申込日'){ var k = nsu(answer); } message = message + '. ' + question + ': ' + answer + k + '\n'; } var title2 = 'お申込みありがとうございます'; var content2 = username + '様\n\nお申込ありがとうございます。\n' + '※このメールはお申込みをいただいた方に自動送信されます。\n\n' + message; MailApp.sendEmail(mail, title2, content2); } ↑に訂正したところ、他の入力項目も入ったメールが届くようになりました。 ただ、やはり満席か否かの返信コメントは追加されておりませんでした。 何が原因なのか、全然検討がつきません。 アドバイスを頂けると助かります。よろしくお願い致します。
papinianus

2019/04/03 05:39

こんな感じでどうでしょうか
sazami

2019/04/03 13:57

papinianus様が最初に書いていただいたコードを参考にさせて頂き、無事希望通りの物ができました。 if(obj[answer] && obj[answer] <= 0)→if(answer && obj[answer] <= 0) とする事で解決いたしました。 他の事でお時間をとらせてしまい、誠に申し訳ございませんでした。 シンプルに作ることが出来て、大変嬉しいです。 お付き合いいただいた事、深く感謝申し上げます。 完成コード----------------------------------------------- function submitForm(e){ var itemResponses = e.response.getItemResponses(); var message = ''; var username = ''; var K = ''; var mail = ''; for (var i = 0; i < itemResponses.length; i++) { var itemResponse = itemResponses[i]; var question = itemResponse.getItem().getTitle(); var answer = itemResponse.getResponse(); if (question == 'お名前'){ username = answer; } if (question == 'メールアドレス'){ mail = answer; } k=''; const obj = getData(); if (question == '申込日'){ if(answer && obj[answer] <= 0) { k='は定員に達していますので受付できません。'; } else { k='に受付いたしました'; } } if (question == '申込日2'){ if(answer && obj[answer] <= 0) { k='は定員に達していますので受付できません。'; } else { k='に受付いたしました'; } } message = message + '. ' + question + ': ' + answer + k + '\n'; } var title = 'お申込みありがとうございます'; var content = username + '様\n\nお申込ありがとうございます。\n' + '※このメールはお申込みをいただいた方に自動送信されます。\n\n' + message; MailApp.sendEmail(mail, title, content); } function getData() { var ret = {}; const url = "https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; var spreadsheet = SpreadsheetApp.openByUrl(url); SpreadsheetApp.openByUrl(url).getSheetByName('申込人数').getRange(2,1,3,5).getValues().forEach(function(e){ ret[(e[0].getMonth()+1) + '月' + e[0].getDate() + '日'] = e[4]}); return ret; }
guest

0

ベストアンサー

API呼び出しが多すぎるので、

javascript

1function getData() { 2 var ret = {}; 3 const url = "https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; 4 SpreadsheetApp.openByUrl(url).getSheetByName("申込人数").getRange(2,1,3,5).getValues().forEach(function(e){ ret[(e[0].getMonth()+1) + "月" + e[0].getDate() + "日"] = e[4]}); 5 return ret; 6}

を作っといて、問題のifブロックのところで

javascript

1 const obj = getData(); 2 if (question == '申込日'){ 3 if(obj[answer] && obj[answer] <= 0) { 4 k='は定員に達していますので受付できません。'; 5 } else { 6 k='に受付いたしました'; 7 } 8 } 9 if (question == '申込日2'){ 10 if(obj[answer] && obj[answer] <= 0) { 11 k='は定員に達していますので受付できません。'; 12 } else { 13 k='に受付いたしました'; 14 } 15 }

こんな感じ。

投稿2019/03/30 17:31

編集2019/04/01 13:30
papinianus

総合スコア12705

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

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

sazami

2019/04/01 13:27

ご回答、ありがとうございます。 こちらのコードの場合、シート名「申込人数」はどこで指定されるのでしょうか? また、申込日と申込日2は各3日づつあるのですが、その判定はどこでされているのでしょうか? このようにスッキリとできれば理想なのですが、知識不足で理解が及んでおりません。 追加でアドバイスをいただけると助かります。
papinianus

2019/04/01 13:39 編集

getSheetByName()を忘れていました。判定ではなく、名前で取得すれば良いと思います。 answerは16日か21日か30日かのどれか1日だけが入っていると思っています。判定がしたいのですか?そうではないですよね、答えとして選んだ日の人数が分かればいいのですよね?回答者が選んだのが何日かを判定するのは無意味だと考えています。 getData()は`{"5月16日":45,"5月21日":46,"5月30日":45}`を作ろうとしています。 こういうデータになっていれば`obj["5月16日"]`とするだけで45が取り出せます (var num = obj["5月16日"];とするとnumが45になる) これが、0より多いかを判定すればいい、という仕様だったかと思います。 (さらに補足。仮にobj["5月16日"]と書いていますが、実際にはobj[answer]なので、得られる数値は、回答者が選んだ16日または21日または30日のどれかに対応する数値です。answerが何日であるか知らなくとも、全く同じ形で求める数値が得られる形式でコーディングすればよいと思います)
sazami

2019/04/01 16:08

コードのご記載、ありがとうございます。 こちらで試させて頂きましたが、 メールを送信できませんでした: 受信者が指定されていません at submitForm(コード:28) のエラーが出てしまいました。 おっしゃる通り、選んだ日の人数がわかればよいですね。 説明不足で申し訳なかったのですが、申込日と申込日2があり、それぞれ同じ日付の3日間がフォームに登録されており、応募者は申込日と申込日2の2日間を選択できます。 申込日と申込日2のそれぞれに対してメールで回答を自動返信したいので、 if (question == '申込日')...以下 部分をコピーし、'申込日'→'申込日2'に 申込日はnsu1(answer)に申込日2はnsu2(answer)にし、 function nsu(answer) {..以下もコピーしてnsu1、nsu2としてみましたが、submitFormも実行されていない状態になってしまいました。 そんな単純な事ではできなかったようです。 引き続きアドバイスをいただけると助かります。よろしくお願い致します。
papinianus

2019/04/01 16:10

↑これはこっちのコードじゃなくて、もう一つの回答についてのコメントで理解したほうが良いですかね?
guest

0

日付のif文の代わりに以下を使うようなイメージでしょうか。

GAS

1for(i=2;i<=4;i++){ 2 3//i行目の日にちを取得する 4var date = sheets.getSheetValues(i, 1, 1, 1); 5 6//2行目の日にちと入力された日にちが一緒なら 7if(date == answer ){ 8 9//i行目の満席判定を取得する 10h1 = sheets.getSheetValues(i, 5, 1, 1); 11 12//i行目の満席判定がマイナスなら 13if ( h1 <= 0 ){ 14 k='は定員に達していますので受付できません。'; 15 16//i行目の満席判定がプラスなら 17 } else { 18 k='に受付いたしました'; 19 } 20 21 22} 23 24 25}

注意点
・日付のフォーマットは今のままではあっていないのでそろえる必要あり
・sheetsは今のままでは読み込まれていないので、読み込んでください

投稿2019/03/29 16:03

dett

総合スコア115

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

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

sazami

2019/03/30 01:10

早速のご回答ありがとうございます。参考にさせて頂き、試してみます。 また改めてご報告させていただきます。
sazami

2019/04/01 13:21

お世話になります。参考に色々試してみましたが、エラーでメールが届かなくなってしまいました。 ↓エラー内容 メールを送信できませんでした: 受信者が指定されていません at submitForm(コード:58) 下記コードを設定しましたが、理解しきれておらず、書き方や書く場所が違っているのでしょうか。 追加のアドバイスを頂けると助かります。 function submitForm(e){ var itemResponses = e.response.getItemResponses(); var message = ''; var username = ''; var h1 = ''; var h2 = ''; var K = ''; var mail = ''; for (var i = 0; i < itemResponses.length; i++) { var itemResponse = itemResponses[i]; var question = itemResponse.getItem().getTitle(); var answer = itemResponse.getResponse(); if (question == 'お名前'){ username = answer; } if (question == 'メールアドレス'){ mail = answer; } function nsu(){ //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します var ur1="https://docs.google.com/spreadsheets/d/XXXXXXXXX/edit#gid=0"; var spreadsheet = SpreadsheetApp.openByUrl(ur1); var sheet = spreadsheet.getSheetByName('申込人数'); var range = sheet.getRange(2,1,3,5); return data; k=''; h1=''; for(i=2;i<=4;i++){ //i行目の日にちを取得する var date = sheets.getSheetValues(i, 1, 1, 1); //2行目の日にちと入力された日にちが一緒なら if(date == answer ){ //i行目の満席判定を取得する h1 = sheets.getSheetValues(i, 5, 1, 1); //i行目の満席判定がマイナスなら if ( h1 <= 0 ){ k='は定員に達していますので受付できません。'; //i行目の満席判定がプラスなら } else { k='に受付いたしました'; } } } message = message + '. ' + question + ': ' + answer + k + '\n'; } var title2 = 'お申込みありがとうございます'; var content2 = username + '様\n\nお申込ありがとうございます。\n' + '※このメールはお申込みをいただいた方に自動送信されます。\n\n' + message; MailApp.sendEmail(mail, title2, content2); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問