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

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

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

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

Google スプレッドシート

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

Google Apps Script

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

Q&A

解決済

1回答

1375閲覧

GASを用いLINE Messaging APIのフォローイベントでuserIdをスプレッドシートに転記する

momokoko

総合スコア38

LINE Messaging API

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

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/06/07 03:09

編集2020/06/07 07:19

タイトル通りですが、こちらの質問の続きです。

LINE_USER_IDをwebhookを使って取得し、最終的には複数の端末にGmailから取得してきた情報を同様の内容を流したいと考えております。

前回の質問で、webhookを利用してLINE_USER_IDを獲得すればいいとわかりましたが、参考にした記事でうまく行きませんでした。

gmail取得するプロジェクトとは分けて、userIDだけ取得するプロジェクトを立ち上げて実験しています。
下記が全コードです。

var access_token = '**********************'; function doPost(e) { var events = JSON.parse(e.postData.contents).events; events.forEach(function(event) { if(event.type == "message") { reply(event); } else if(event.type == "follow") { follow(event); } else if(event.type == "unfollow") { unFollow(event); } }); } function follow(e) { // 追記 console.log("フォロー確認"); var spreadsheet = SpreadsheetApp.openById('****************'); //スプレッドシートの指定 var sheet = spreadsheet.getActiveSheet(); //シートを取得する sheet.appendRow([e.source.userId]); //ユーザーIDをシートに追加する // sheet.appendRow(['ユーザーID']); //ユーザーIDをシートに追加する } function unFollow(e){ // 追記 console.log("アンフォロー確認"); var spreadsheet = SpreadsheetApp.openById('****************'); var sheet = spreadsheet.getActiveSheet(); var result = findRow(sheet, e.source.userId, 1); if(result > 0){ sheet.deleteRows(result); } } function findRow(sheet,val,col){ var data = sheet.getDataRange().getValues(); for(var i=0; i < data.length; i++){ if(data[i][col-1] === val){ return i+1; } } return 0; }

follow関数を単体で実行して見るとスプレッドシートに「ユーザーID」という文字が書き込まれました。
['ユーザーID']の部分を[e.source.userId]に書き換えて
sheet.appendRow([e.source.userId])
とした場合、フォロー解除ブロックを繰り返してもスプレッドシートにuseridはかきこまれませんでした。
調べてもよくわかない状態なので、ご教授頂きたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因がどこにあるのか絞り込めないので、まずはどこまで動いているか絞り込んでください。

  1. エラーが出ているか。doPost/follow 関数が呼ばれているか。
  1. LINE チャネルの管理画面で Webhook の設定はされているか。

  2. 正しい手順で「Web アプリケーションとして導入」されているか。

    • Webhook に設定した URL が https://script.google.com/macros/s/(....)/exec の様に、/exec で終わる場合はソース修正後に毎回、プロジェクトバージョンを「New」にしているか。

    • /dev で終わる URL を Webhook に登録している場合は、/exec の URL に変更してみる。
      (私の勘違いかもしれませんが)/dev だと Webhook 呼ばれなかったことがあったので。

    • 「Who has access to the app」は「Anyone, even anonymous」に設定しているか。

投稿2020/06/07 04:28

draq

総合スコア2577

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

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

momokoko

2020/06/07 07:21 編集

回答ありがとうございます! Qiitaの記事のようにログ確認を確認してみました。 その結果、LINE上でフォロー解除とアンフォローを繰り返すとスプレッドシートに「ユーザーID」と追記されるようになりました。 ログにはconsole.log("フォロー確認");と表示されています。 他方でsheet.appendRow(['ユーザーID']);からsheet.appendRow([e.source.userId]);に書き換えるとログにはTypeError: Cannot read property 'userId' of undefined at follow(GetUserId:22:29)とエラーを出してしまいました。 また、フォロー解除しているのにも関わらず"アンフォロー確認"とは表示されておりません。
draq

2020/06/07 07:28

それならdoPostに console.log(JSON.stringify(events)) とでもして、events の中身を確認してください。 event.source が undefined になっているようなので。
momokoko

2020/06/07 07:32 編集

五月雨式にすみません。 >/ex /exec で終わる場合はソース修正後に毎回、プロジェクトバージョンを「New」にしているか ec で終わる場合はソース修正後に毎回、プロジェクトバージョンを「New」にしているか 上記についてよく理解できなかったのですが、 コードを変更したら、毎回スクリプトファイルの「公開」=>「ウェブアプリケーション導入」というものを実施するのでしょうか? その他1、2番については確認しましたが特に問題はなかったように思えますが、今までLINE上でフォローしてもスプレッドシートに追記されなかったので、ミスがあったのかもしれないです。
draq

2020/06/07 07:39

ウェブアプリケーションとして公開した場合は公開時に指定したバージョンが /exec のURLで公開されます。 指定したバージョンに関係なく最新ソースに基づいたバージョンが /dev で公開されます。 リリースバージョンと開発バージョンとでも考えればいいです。 公開時にバージョンに「New」を指定すると、その時点のソースに新しく公開用のバージョン番号が付けられます。
draq

2020/06/07 07:42

なお、ログ出力の処理を追加して、ログが出力されることが確認できたのなら、ウェブアプリケーションの公開時のバージョン指定は「New」を指定していると思われるのでそこの手順は間違ってないはずです。
momokoko

2020/06/07 07:47

すみません、トリガーで1分ごとにfollow関数実行する設定にしていて、それによってスプレッドシートに追記されているだけでした。 それを解除してからLINEbot上でフォロー解除してみても動きがなくなってしまいました。
momokoko

2020/06/07 07:53 編集

一個のエラーコードが他とは違っていてconsole.log(JSON.stringify(events))のものかもしれないと思ったので掲載します。 2020-06-07 16:38:40.479 JST Error detected in000000000000000000000000000000000000 すべて展開 | すべて折りたたむ{ insertId: "000000000000000000000" jsonPayload: { @type: "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.Insight" errorEvent: { context: { httpRequest: { } reportLocation: { filePath: "GetUserId" functionName: "doPost" lineNumber: 6 } user: "0000000000000000000000000000000000" } eventTime: "2020-06-07T07:38:38.745Z" message: "TypeError: Cannot read property 'postData' of undefined at doPost(GetUserId:6:29)" serviceContext: { resourceType: "app_script_function" service: "000000000000000000000000000000000" } } errorGroup: "CIWo7IWL5NiMMQ" message: "Error detected in 0000000000000000000000" } logName: "projects/debaglog/logs/clouderrorreporting.googleapis.com%2Finsights" receiveTimestamp: "2020-06-07T07:38:40.479937126Z" resource: { labels: { function_name: "doPost" invocation_type: "editor" project_id: "debaglog" } type: "app_script_function" } severity: "NOTICE" timestamp: "2020-06-07T07:38:40.479937126Z" } 無効なリクエスト: Request contains an invalid argument.
momokoko

2020/06/07 08:02 編集

LINEBot上のチャンネルを変更したら、「アンフォロー確認」とLoggingに出力されました。
draq

2020/06/07 08:02

このエラーメッセージは、TypeError: Cannot read property 'postData' of undefined と言っているように doPost(e) の e が undefined だと言っているだけです。 直接 doPost を起動しませんでしたか?
momokoko

2020/06/07 08:05 編集

いまスプレッドシートを確認したら、ユーザーIDが追加されていました!もう少し確認してみます。
momokoko

2020/06/07 09:00

問題なくできてました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問