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

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

新規登録して質問してみよう
ただいま回答率
85.50%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

Q&A

解決済

2回答

551閲覧

Googleフォームの通知を、LINEに送りたい。

koromo_t

総合スコア60

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

0グッド

0クリップ

投稿2018/03/13 09:49

編集2018/03/27 00:52

前提・実現したいこと

こんにちは!
https://teratail.com/questions/116655の質問で一旦解決した、
Googleフォームを利用したWEB拍手のプログラミングについての質問です。

「回答にメッセージがあればメール通知する」というところまではできました。
その後、「LINE Notify」というものの存在を知り、
メール通知に加えて、さらにLINE通知もしたいと思いました。
LINE通知については、すべての回答に対してプッシュ通知するようにしたいです。

###試したこと
そこで、スクリプトを書いてみましたが、うまく作動してくれません。
何がどうおかしいのかわからないので、有識者のかたに添削していただけると嬉しいです。
よろしくお願いします。

javaScript

1function sendNotification() { 2 //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します 3 var url = "***"; 4 var sheet = SpreadsheetApp.openByUrl(url); 5 var ss = SpreadsheetApp.getActiveSpreadsheet(); 6 var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue(); 7 8function sendHttpPost(message){ 9 var token = [***]; 10 var options = 11 { 12 "method" : "post", 13 "payload" : "message=" + message, 14 "headers" : {"Authorization" : "Bearer "+ token} 15 }; 16 if(val4!=''){ // = if you edit data in col D 17 var message = val4 ; 18 sendHttpPost(message); 19 UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); 20} 21} 22}

###追記(2018/03/14 18:34)

javaScript

1function sendNotification() { 2 //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します 3 var url = "***"; 4 var sheet = SpreadsheetApp.openByUrl(url); 5 var ss = SpreadsheetApp.getActiveSpreadsheet(); 6 var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue(); 7 8 if(val4!=''){ // = if you edit data in col D 9 sendHttpPost(val4); 10 } 11 12function sendHttpPost(message){ 13 var token = [***]; 14 var options = { 15 "method" : "post", 16 "payload" : "message=" + message, 17 "headers" : {"Authorization" : "Bearer "+ token} 18 }; 19 UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); 20} 21}

#~解決後のまとめ~

javaScript

1function sendNotification() { 2 //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します 3 var url = "***"; 4 var sheet = SpreadsheetApp.openByUrl(url); 5 var ss = SpreadsheetApp.getActiveSpreadsheet(); 6 var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue(); 7 8 if(val4!=''){ // = if you edit data in col D 9 sendHttpPost(val4); 10 } 11 12function sendHttpPost(message){ 13 var token = [***]; 14 var options = { 15 "method" : "post", 16 "payload" : "message=" + message, 17 "headers" : {"Authorization" : "Bearer "+ token} 18 }; 19 UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); 20} 21}

[***]の「[]」の部分をダブルクォーテーションにすると、うまくいきました。
思わぬ伏兵でした。。。

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

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

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

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

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

guest

回答2

0

ベストアンサー

これは再帰処理ですか?違いますよね?
とりあえず、sendHttpPost()からif文ブロックを出しましょう。
何故かは考えてくださいね。
以下修正で大丈夫かと思いますが、動作確認はしていませんので参考までに。

javascript

1function sendNotification() { 2 /*省略*/ 3 var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue(); 4 5 if(val4!=''){ // = if you edit data in col D 6 sendHttpPost(val4); 7 } 8} 9function sendHttpPost(message){ 10 var token = [***]; 11 var options = {/*省略*/}; 12 UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); 13}

あと、「うまく作動」しないではどういう状況なのかわからないですよ。
例えばエラーメッセージが表示されるとか、処理は完了したが結果が違うとか。。。

なお、エラー内容は実行トランスクリプト(スクリプトエディタ画面より 表示 > 実行トランスクリプト)等で確認し、提示したほうが良いです。

投稿2018/03/13 12:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

koromo_t

2018/03/13 19:00

お返事ありがとうございます! もしval4に変化があれば、val4の値をポストする、ということを書いたつもりだったのですが、 それはsendHttpPost(message)の動きには関係がない?から、 外に出さないといけないのですね…? なるほど。実行トランスクリプトというものがあるのですね。 見てみたところ、もとのスクリプトだと、「実行が無事終了しました」になっていますが、 LINE通知はありません。エラーも出ていないし、無反応です。 そして、回答していただいたものを参考に書き換えて実行したところ、 ReferenceError、トークン部分が定義されていませんと出ました。 しかし、トークン部分はLINE Notifyで取得したものを書いているので、 定義していると思うのですが…。 あと、 「もしval4に変化があれば、sendHttpPost(message)を実行する(messageとはval4の値)」 と書いたあとで、「sendHttpPost(message)というのは~」と説明?してもいいんですね。 なんとなく、先に説明を書かないといけない気がするんですが。勉強になります。
退会済みユーザー

退会済みユーザー

2018/03/13 22:58

> ReferenceError、トークン部分が定義されていません そのままの意味でしょう。 トークン部分の記述の仕方が間違っているからだと思いますよ。 (具体的には var token = [***]; の部分) APIがらみのトラブルの大多数は送信データの成形ミスです。 公式のドキュメントやリファレンスがあるはずですので、きちんと確認しましょう。
koromo_t

2018/03/14 09:38 編集

探してみると、「LINE Notifyの動作確認ができるフォーム」というものを見つけたので、 アクセストークンを入力してメッセージを送信してみたところ、LINEにポストができました。 なので、トークンは間違っていないはずです。 成形については、どうしてもわからないので、スクリプトを質問本文に追記しました。 ネットで拾ってきたスクリプトをそのまま流用しているだけなので、 おかしくなりようがないような気もするのですが…。 エディタで見ると、最後のoptionsが色付きにならずに死んでいる感じがするので、 そのあたりのカッコの付け方がおかしいのだと思います。
退会済みユーザー

退会済みユーザー

2018/03/14 13:32

トークン自体が間違っていないとうのはご質問自体の大前提です。 推測ですが、間違っていましたら申し訳ございません。 仮に提示されているコード中「***」のトークンが「ABCDEFG」であるとします。 var token = [ABCDEFG]; と記述しているのではないでしょうか? この場合、一次元配列に変数ABCDEFGにて参照される値を定義していることになります。 ただ、ABCDEFが定義されていない旨のエラーが出ると思いますが。 > ネットで拾ってきたスクリプトをそのまま流用しているだけなので、 おかしくなりようがないような気もするのですが…。 情報が古くアップデートされていないなら挙動も変わることがあります。 可能でしたらコピー元もお知らせいただければと思います。
koromo_t

2018/03/14 20:25

>var token = [ABCDEFG]; まさに、このように記述しています。 むしろ、それ以外の記述方法が思い付きませんでした…。 強いて言えば、思い付くのはカッコを外すことぐらいでしたが、 それでも状況は変わりませんでした。 エラーは、正確に書くと、おっしゃる通り、 「実行に失敗: ReferenceError: 「ABCDEFG」が定義されていません。」 と出ます。 コピー元は、以下のURLのはずです。 https://qiita.com/tadaken3/items/5f916a12587e42ece814 大して古い記事とも思われないのですが…。 お手数をおかけして、申し訳ありません…!
退会済みユーザー

退会済みユーザー

2018/03/14 23:05

初心者申請されていますので、かなり大目に見ていますが、エラー内容は正確に提示すべきですよ。 もちろん、伏せるべき部分は伏せて、何を伏せているのかを明確にする必要はありますが。 「一次元配列に変数ABCDEFGにて参照される値を定義している」状態である、ということが回答です。 変数とは?配列とは?参照とは?上記の意味が理解できず、明確な回答例を求めていらっしゃるならそれは丸投げと判断されても仕方ないことですよ。 あとはご自身で試行錯誤してみてください。
koromo_t

2018/03/15 11:13 編集

「変数ABCDEFGにて参照される値を定義している」といっても、 変数ABCDEFGにて参照される値なんてないような気がするのですが…。 試行錯誤といっても、一次元配列などのキーワードを調べて解説を読んでみても、 理解できそうになかったので、どうやらお手上げのようです。 一次元配列が「値を入れておく箱が一列に並んだ配列のこと」ということまではわかるのですが、 それをどう使うのか、わかりません。 javaScriptを使いこなしているみなさんは、どのようにして勉強されたのでしょう…。 ここまでお付き合いいただき、ありがとうございました。 丸投げしたつもりはなかったのですが、申し訳ありませんでした…。
guest

0

#~解決後のまとめ~

javaScript

1function sendNotification() { 2 //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します 3 var url = "***"; 4 var sheet = SpreadsheetApp.openByUrl(url); 5 var ss = SpreadsheetApp.getActiveSpreadsheet(); 6 var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue(); 7 8 if(val4!=''){ // = if you edit data in col D 9 sendHttpPost(val4); 10 } 11 12function sendHttpPost(message){ 13 var token = [***]; 14 var options = { 15 "method" : "post", 16 "payload" : "message=" + message, 17 "headers" : {"Authorization" : "Bearer "+ token} 18 }; 19 UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options); 20} 21}

[***]の「[]」の部分をダブルクォーテーションにすると、うまくいきました。
思わぬ伏兵でした。。。

投稿2018/03/15 21:00

編集2018/03/27 04:52
koromo_t

総合スコア60

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問