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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google フォーム

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

Google Apps Script

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

Q&A

解決済

2回答

681閲覧

Googleフォームの結果をLINEグループに自動転送(たまにエラーになります…)

dshiraiwa

総合スコア9

Google フォーム

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

Google Apps Script

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

0グッド

0クリップ

投稿2023/01/29 16:34

編集2023/02/02 15:57

前提

Googleフォームの入力結果をLINEグループに自動転送する設定をしているのですが、上手くいく特もあれば、上手くいかない時があり、不安定な状態となっています。届かない時は、以下のエラーメッセ―ジがでます。
おそらく日付の部分に問題があるのかなと思っています。
日付については、当日であれば入力しなくても済むようにタイムスタンプから日付をもってくるようにし、当日でなければ日付を入力するというスタイルにしました。

初心者なのですが、今回もご相談させていただきたく書き込ませていただきました。
なにとぞ、ご指導のほど、お願いいたします。

実現したいこと

安定してGoogleフォームの結果をここに実現したい。

  • Googleへの入力が
  • LINEグループに自動で転送される
  • たまにエラーになることを防ぎたい

発生している問題・エラーメッセージ

TypeError: inp_date.replace is not a function at autoLine(コード:46:27)

該当のソースコード

GAS

1function autoLine(e) { 2 let itemResponses = e.response.getItemResponses(); 3 var inp_date = ''; 4 let str = ''; 5 6 for (var i = 0; i < itemResponses.length; i++) { 7 var itemResponse = itemResponses[i]; 8 var question = itemResponse.getItem().getTitle(); 9 var answer = itemResponse.getResponse(); 10 switch (i) { 11 case 0: 12 inp_date = answer; 13 str += "\n"; 14 break; 15 case 1: 16 str += question + ":" + answer.toString(); 17 str += "\n"; 18 break; 19 case 2: 20 str += question + ":" + answer.toString(); 21 str += "\n"; 22 break; 23 case 3: 24 str += question + ":" + answer.toString(); 25 str += "\n"; 26 break; 27 case 4: 28 str += question + ":" + answer.toString(); 29 str += "\n"; 30 break; 31 } 32 33 if( inp_date === ''){ 34 var timestamp = new Date(); 35 var mm = ("0" + ( timestamp.getMonth() +1)).slice(-2); 36 var dd = ("0" + timestamp.getDate()).slice(-2); 37 var date = new Date(); 38 var day = date.getDay(); 39 var arr_day = new Array('日', '月', '火', '水', '木', '金', '土');  40 var t_date = ( mm + "月" + dd + "日" ); 41 var c_date = t_date + '(' + arr_day[day] + ')'; 42 } 43 else{ 44 Logger.log(inp_date); 45 Logger.log(typeof inp_date); 46 var t_date = inp_date.replace('-', '月', date) + '日'; 47 inp_date = inp_date.split('-'); 48 var mm = inp_date[0] - 1; 49 var dd = inp_date[1]; 50 var date = new Date(); 51 date.setMonth(mm); 52 date.setDate(dd); 53 var day = date.getDay(); 54 var arr_day = new Array('日', '月', '火', '水', '木', '金', '土');  55 var c_date = t_date + '(' + arr_day[day] + ')'; 56 } 57 } 58 59 let token = "LINE Notify トークン"; 60 let body = "\n" + c_date + "\n" 61 + str.slice(0) ; 62 sendLine(token, body); 63} 64 65function sendLine(token, body) { 66 let options = 67 { 68 "method" : "post", 69 "payload" : {"message": body, 70 }, 71 "headers" : {"Authorization" : "Bearer "+ token} 72 }; 73 74 UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); 75}``` 76 77### 試したこと 78 79何度か試したのですが、届く時と届かない時があります。 80 81### 補足情報(FW/ツールのバージョンなど) 82 83こちらのサイトを参考にしました。 84 85【コピペでOK!】GASでGoogleフォームの回答を管理者に自動LINE通知する方法 - Yuki's bnb blog 86[https://www.yukibnb.com/entry/gas_form_auto_line_to_admin](url)

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

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

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

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

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

guest

回答2

0

フォームの内容が分からないので推測ですが、、、

else {} の中のvar t_date = inp_date.replace('-', '月', date) + '日';でエラーになっていると思うので、inpu_dateで取得できる値はおそらくDate型であり文字列ではないため、.replace()がつかえないと思います。

エラーが起きない時はif()true.replace()してないので大丈夫なのかと。
falseでは、.replace()しようとしているのでエラーになるのかと推察しています。

修正案

かなり回りくどい手法ではありますが、元のコードを生かすなら、下記のコードでできませんでしょうか?

diff

1 else{ 2- var t_date = inp_date.replace('-', '月', date) + '日'; 3- inp_date = inp_date.split('-'); // t_dateの間違いではないでしょうか? 4- var mm = inp_date[0] - 1; // t_dateの間違いではないでしょうか? 5- var dd = inp_date[1]; // t_dateの間違いではないでしょうか? 6+ var t_date = Utilities.formatDate(inp_date, 'JST', 'yyyy-MM-dd'); 7+ t_date = t_date.split('-'); 8+ var mm = t_date[0] - 1; 9+ var dd = t_date[1];

投稿2023/01/29 16:54

Cocode

総合スコア2314

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

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

dshiraiwa

2023/01/29 17:08

さっそくのご回答、本当にありがとうございます!! 確認したのですが…たしかに、エラーになっているのは、日付を入力している場合(つまりはelseの時)でした! さっそくいただいたコードで試したいと思います! また、ご報告させていただきます。 深夜にもかかわらず、こんなにも早くお返事をいただけるとは思っておらず、本当に嬉しいです! ありがとうございますm(_ _)m
dshiraiwa

2023/01/29 17:24

夜分にスイマセン。やってみたのですが…今度はこちらのエラーが出てしまいました…( ;∀;) Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。 at autoLine(コード:399:28)
Cocode

2023/01/29 17:27

else {}の1行目と2行目に以下を書いてみて、結果を教えていただけないでしょうか? Logger.log(inp_date); Logger.log(typeof inp_date);
Cocode

2023/01/29 17:29 編集

それから、elseの中でどのような処理をしたいのか具体的に説明していただけないでしょうか? それに合わせてコードを書いてみます。 例) inp_dateで取得できる日付を「2000年12月7日(月)」みたいな形にしたい。
dshiraiwa

2023/01/30 00:13

おはようございます! ありがとうございますっ!! スイマセン!コメントしたあと就寝してしまったのですが… お返事いただいていたのですね!! 本当にお心遣いに感謝です!!!m(_ _)m > else {}の1行目と2行目に以下を書いてみて、結果を教えていただけないでしょうか? こちらの結果というのは、実行してみるといことですね! 今日から出張中で環境にないので、戻りましたらすぐにやってみたいと思います!! > それから、elseの中でどのような処理をしたいのか具体的に説明していただけないでしょうか? > それに合わせてコードを書いてみます。 いや、そんな………💦 スイマセン!!本当にありがとうございます<(_ _)> inp_dateで取得できる日付は「01月29日(日)」のようにしたいと思っています。
dshiraiwa

2023/02/02 15:08

> else {}の1行目と2行目に以下を書いてみて、結果を教えていただけないでしょうか? > Logger.log(inp_date); > Logger.log(typeof inp_date); 上記を書いて実行したところ、以下のエラーメッセージが出てきました! ↓ エラー TypeError: Cannot read properties of undefined (reading 'response')
dshiraiwa

2023/02/02 15:40 編集

ちなみに > Logger.log(inp_date); > Logger.log(typeof inp_date); を書かなかった場合は以下のエラーメッセージが出ました(2行目?) ↓ TypeError: Cannot read properties of undefined (reading 'response') autoLine @ コード.gs:2 と出ました。
Cocode

2023/02/02 15:49

お返事ありがとうございます。 「Googleフォーム」のスクショいただけますでしょうか?日付をどのように入力させているのか確認したいですm(_ _)m
guest

0

自己解決

43~53行目を以下に書き換えたところ、解決しました。

else{ var t_date = inp_date.toString().replace('-', '月', date) + '日'; var mm = inp_date[0] - 1; var dd = inp_date[1]; var date = new Date(); date.setMonth(mm); date.setDate(dd); var day = date.getDay(); var arr_day = new Array('日', '月', '火', '水', '木', '金', '土');  var c_date = t_date + '(' + arr_day[day] + ')'; }

こちらのサイトを見つけまして、こちらを実行したところ、解決しました!

【GAS】TypeError: XXX.replace is not a functionの原因と解決策

投稿2023/02/02 16:16

dshiraiwa

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問