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

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

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

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

Q&A

2回答

991閲覧

[GAS] LINE通知のタイムスタンプに関してのスクリプトエラーが解決できません。至急解決したいです!

piyopiyo_3

総合スコア6

Google Apps Script

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

0グッド

0クリップ

投稿2022/05/15 09:53

編集2022/05/15 10:05

Googleフォームの回答が入るとLINEに通知が来る設定をしています。

Googleフォームに回答が入力されると、
LINEに通知が来るようなスクリプトをネットを参考に作成しました。

テスト用のGoogleフォームとLINEグループでは通知が来たのに、
本番用のグループでは通知が来ませんでした。

コードは、テスト用のGASを丸々コピーして、TOKENはしっかりと本番用のもので設定しているのにも関わらずです。

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

本番用のGASで確認したところ、

Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。(行 12、ファイル「コード」)

と表示されました。

該当のソースコード

コードは以下の通りです。

function GoogleFormToLine(){ var sheet = SpreadsheetApp.getActiveSheet(); var row = sheet.getLastRow(); var column = sheet.getLastColumn(); var range = sheet.getDataRange(); var message = "";  for(var i=1;i<=column;i++){  var item = range.getCell(1, i).getValue();  var value = range.getCell(row, i).getValue();   if(item == "タイムスタンプ"){   value = Utilities.formatDate(value,"JST","yy/MM/dd(E) hh:mm:ss");  } if(item == "クライアントからの連絡日を記入してください。"){   value = Utilities.formatDate(value,"JST","yy/MM/dd(E)");  } if(item == "第1候補日を入力してください。"){   value = Utilities.formatDate(value,"JST","yy/MM/dd(E)");  } if(item == "第2候補日を入力してください。"){   value = Utilities.formatDate(value,"JST","yy/MM/dd(E)");  } if(item == "第3候補日を入力してください。"){   value = Utilities.formatDate(value,"JST","yy/MM/dd(E)");  } if(item == "第4候補日を入力してください。"){   value = Utilities.formatDate(value,"JST","yy/MM/dd(E)");  } if(item == "第5候補日を入力してください。"){   value = Utilities.formatDate(value,"JST","yy/MM/dd(E)");  }  message += "\n■"+item+"\n"+value+"\n";  } SendToLine(message); } function SendToLine(message){ var token = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); var op = { "method" : "post", "Content-Type" : "application/x-www-form-urlencoded", "payload": "message=" + message, "headers":{"Authorization" : "Bearer " + token} }; var res = UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op); Logger.log(JSON.parse(res.getContentText())); }

至急、回答いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/05/15 10:14

データの内容を確認したいです。 エラーが発生しているスクリプトで、 11行目の   if(item == "タイムスタンプ"){ の直後に console.log("row="+row); console.log("value="+value); console.log("value type = "+Object.prototype.toString.call(value)); の3行を挿入して実行したとき、エラーの前にどのようなログ出力がされますか?書いてください。
piyopiyo_3

2022/05/15 11:00

ログは出力されず、「Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。(行 15、ファイル「コード」)」というエラーが表示されました。
退会済みユーザー

退会済みユーザー

2022/05/15 11:27

「行 15」ということから、エラーの発生位置が質問文記載の行(11行目)から変わってますね。 11行目はエラーなく処理されているようです。(このためログにエラー以外の表示何も表示されなくなっています) 11行目の   if(item == "タイムスタンプ"){ の直後ではなく、11行目の「直前」に console.log("row="+row); console.log("value="+value); console.log("value type = "+Object.prototype.toString.call(value)); を入れて実行した場合はログにどう表示されるでしょうか?
piyopiyo_3

2022/05/15 12:01

直前に追加しても先ほどと同じく、「Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。(行 15、ファイル「コード」)」というエラーが表示されました。 ログは表示されていないと思います。
piyopiyo_3

2022/05/15 12:02

表示ダブ>ログを確認したところ、以下の表示がありました。 [22-05-15 21:00:25:281 JST] row=115 [22-05-15 21:00:25:283 JST] value= [22-05-15 21:00:25:285 JST] value type = [object String] [22-05-15 21:00:25:304 JST] Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。 at GoogleFormToLine(コード:15:23)
退会済みユーザー

退会済みユーザー

2022/05/15 12:26 編集

「value=」ということは、スプレッドシートの値が空白だったということになります。 15行目は「クライアントからの連絡日を記入してください。」の回答が入るところになりますが、 フォームでの回答時に連絡日を記入せず空白で回答した可能性があります。
piyopiyo_3

2022/05/15 12:46 編集

クライアントからの連絡日は必須入力なので、空白で回答することはできません。 また入力形式も、フォームのの入力形式が”日付”になっているので、形式が異なるということもありません。 テストのGoogleフォームとスプレッドとGASではできたのに、本番だけエラーが出てしまうのも謎なんです。
piyopiyo_3

2022/05/15 12:52 編集

日付指定を無くせば、エラーなく処理されるのでしょうか?
退会済みユーザー

退会済みユーザー

2022/05/15 13:16

テスト用ではうまくいっているとのことだったので可能性からは除外していたんですが、 本番用の方は、「フォーム送信時」のトリガーが発動した時点で、 スプレッドシートの末尾行のデータが空白の状態のままスクリプトの処理が走ってしまっている可能性があります。 (そして処理が終わった後でスプレッドシートの末尾行にデータが追記されている、ということになります) そのような状態でもデータを取得できるコードを書いているのでしばらくお待ちください。
guest

回答2

0

本番用の方は、「フォーム送信時」のトリガーが発動した時点で、
スプレッドシートの末尾行のデータが空白の状態のままスクリプトの処理が走ってしまっている可能性があります。

下記のように、スプレッドシートに流れてくるフォームデータを直接処理するようにしてみてはいかがでしょうか。
(1行目の引数 e にフォーム回答データが入ります)
※スクリプトエディタのトリガーで、「フォーム送信時」に、下記 GoogleFormToLine関数が実行されるよう正しく設定されていることが前提です。

js

1function GoogleFormToLine(e) { 2 var values = e.namedValues; 3 var message = ""; 4 var datetimeQustions = [ 5 "クライアントからの連絡日を記入してください。", 6 "第1候補日を入力してください。", 7 "第2候補日を入力してください。", 8 "第3候補日を入力してください。", 9 "第4候補日を入力してください。", 10 "第5候補日を入力してください。" 11 ]; 12 if (Object.keys(values).length === 0) { 13 message = "回答データがありません"; 14 } else { 15 Object.keys(values).forEach(item => { 16 var value = values[item][0]; 17 if (item === 'タイムスタンプ') { 18 value = Utilities.formatDate(new Date(value), "Asia/Tokyo", "yy/MM/dd(E) hh:mm:ss"); 19 } 20 else if (datetimeQustions.includes(item)) { 21 if (Object.prototype.toString.call(value) === '[object String]' && value.match(/\d+\/\d+\/\d+/)) { 22 value = Utilities.formatDate(new Date(value), "Asia/Tokyo", "yy/MM/dd(E)"); 23 } 24 } 25 message += "\n■" + item + "\n" + value + "\n"; 26 }); 27 } 28 SendToLine(message); 29} 30 31function SendToLine(message) { 32 33 var token = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN'); 34 var op = 35 { 36 "method": "post", 37 "Content-Type": "application/x-www-form-urlencoded", 38 "payload": "message=" + message, 39 "headers": { "Authorization": "Bearer " + token } 40 }; 41 var res = UrlFetchApp.fetch("https://notify-api.line.me/api/notify", op); 42 Logger.log(JSON.parse(res.getContentText())); 43}

投稿2022/05/15 13:44

編集2022/05/15 13:45
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

piyopiyo_3

2022/05/15 14:14

丁寧にありがとうございます。 「TypeError: Cannot read property 'namedValues' of undefined(行 2、ファイル「コード」)」というエラーが出てしまったのは何故でしょうか?
piyopiyo_3

2022/05/15 14:23

また、クライアントからの連絡日は必須ですが、候補日は必須ではありません。 候補日が入ったときのみ、「yy/MM/dd(E)」の形にできればと思っています。
退会済みユーザー

退会済みユーザー

2022/05/15 21:15 編集

「TypeError: Cannot read property 'namedValues' of undefined(行 2、ファイル「コード」)」というエラーが出てしまった」 →スクリプトエディタから直接実行していませんか? または、コードを回答のとおりにコピーしておらず、一行目の引数にeがなかったりしませんか? スクリプトエディタから直接実行するとそのエラーが出るのは仕様です。 必ずフォームから実際に送信して試してください。
guest

0

  value = Utilities.formatDate(value,"JST","yy/MM/dd(E) hh:mm:ss");

formatDateという関数は、第一引数がDate型(のはず)です。
ところが、エラーメッセージでは

パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。

そーなってへんけど、どないなってまんねん、とおっしゃってますよ

投稿2022/05/15 13:23

y_waiwai

総合スコア87747

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

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

y_waiwai

2022/05/16 00:41

しかし、 >  var value = range.getCell(row, i).getValue(); がおかしいってはなしなんだから、その本番環境でvalueになにが入ってるか見れば何が起こってるかわかると思うんだけどねえ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問