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

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

ただいまの
回答率

90.12%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,493

koromo_t

score 58

 前提・実現したいこと

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

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

試したこと

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

function sendNotification() {
  //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します
  var url = "***";
  var sheet = SpreadsheetApp.openByUrl(url);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue();

function sendHttpPost(message){
  var token = [***];
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
  if(val4!=''){ // = if you edit data in col D
  var message = val4 ;
  sendHttpPost(message);
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
}
}

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

function sendNotification() {
  //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します
  var url = "***";
  var sheet = SpreadsheetApp.openByUrl(url);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue();

  if(val4!=''){ // = if you edit data in col D
     sendHttpPost(val4);
  }

function sendHttpPost(message){
  var token = [***];
  var options =  {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
    UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
}

~解決後のまとめ~

function sendNotification() {
  //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します
  var url = "***";
  var sheet = SpreadsheetApp.openByUrl(url);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue();

  if(val4!=''){ // = if you edit data in col D
     sendHttpPost(val4);
  }

function sendHttpPost(message){
  var token = [***];
  var options =  {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
    UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

function sendNotification() {
   /*省略*/
   var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue();

   if(val4!=''){ // = if you edit data in col D
     sendHttpPost(val4);
   }
}
function sendHttpPost(message){
   var token = [***];
   var options = {/*省略*/};
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 05:25

    >var token = [ABCDEFG];
    まさに、このように記述しています。
    むしろ、それ以外の記述方法が思い付きませんでした…。
    強いて言えば、思い付くのはカッコを外すことぐらいでしたが、
    それでも状況は変わりませんでした。

    エラーは、正確に書くと、おっしゃる通り、
    「実行に失敗: ReferenceError: 「ABCDEFG」が定義されていません。」
    と出ます。

    コピー元は、以下のURLのはずです。
    https://qiita.com/tadaken3/items/5f916a12587e42ece814
    大して古い記事とも思われないのですが…。

    お手数をおかけして、申し訳ありません…!

    キャンセル

  • 2018/03/15 08:05

    初心者申請されていますので、かなり大目に見ていますが、エラー内容は正確に提示すべきですよ。
    もちろん、伏せるべき部分は伏せて、何を伏せているのかを明確にする必要はありますが。

    「一次元配列に変数ABCDEFGにて参照される値を定義している」状態である、ということが回答です。
    変数とは?配列とは?参照とは?上記の意味が理解できず、明確な回答例を求めていらっしゃるならそれは丸投げと判断されても仕方ないことですよ。

    あとはご自身で試行錯誤してみてください。

    キャンセル

  • 2018/03/15 20:06 編集

    「変数ABCDEFGにて参照される値を定義している」といっても、
    変数ABCDEFGにて参照される値なんてないような気がするのですが…。

    試行錯誤といっても、一次元配列などのキーワードを調べて解説を読んでみても、
    理解できそうになかったので、どうやらお手上げのようです。
    一次元配列が「値を入れておく箱が一列に並んだ配列のこと」ということまではわかるのですが、
    それをどう使うのか、わかりません。
    javaScriptを使いこなしているみなさんは、どのようにして勉強されたのでしょう…。

    ここまでお付き合いいただき、ありがとうございました。
    丸投げしたつもりはなかったのですが、申し訳ありませんでした…。

    キャンセル

0

~解決後のまとめ~

function sendNotification() {
  //変数spreadsheetに指定のスプレッドシートオブジェクトを取得します
  var url = "***";
  var sheet = SpreadsheetApp.openByUrl(url);
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var val4 = sheet.getRange('C'+ sheet.getLastRow()).getValue();

  if(val4!=''){ // = if you edit data in col D
     sendHttpPost(val4);
  }

function sendHttpPost(message){
  var token = [***];
  var options =  {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
    UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
}


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる