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

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

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

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Q&A

1回答

1943閲覧

GoogleAppsScriptでGmailをLinebot に通知する

Thaireo

総合スコア0

LINE Messaging API

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

0グッド

0クリップ

投稿2021/08/09 07:55

前提・実現したいこと

最近、GASを始めたthaireoと言います。業務改善ツールとしてLINEを活用したツールを作り始めました。

GMail to Line Bot
GMAILを指定条件(未読かつ指定ラベル)で検索した結果をに通知するLINE BOTを作りたくてチャレンジしています。
Notifyでは作成できましたが、グループLINEではなく、登録者の情報が他の人に見れないLINE BOTで作成したいです。
初心者の質問で申し訳ありませんが、どなたかアドバイスよろしくお願いします

前提条件
CHANNEL_TOKENやLINE_NOTIFY_TOKENは他のツールを作ったときに使用し問題ありません。

ネットで希望の条件の作成方法が載っていましたが途中でエラーが出てつまっています。いろいろネットで調べていますが解決できません。

参考にしたページ
https://qiita.com/sanlike/items/82f732fa98c5b61a1307

機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ TypeError: Cannot read property 'postData' of undefined doPost @ コード.gs:7 ### 該当のソースコード

ソースコード
/* ------------------------------------------------------- */
// setting: LINE BOT
var LINEBOT_CHANNEL_TOKEN = 'XXXXXXXXXXXXXXXX';

// setting: Line Notify ※必要であれば
var LINE_NOTIFY_TOKEN = "XXXXXXXXXXXXXXXX";

// setting: GAMIL ※未読 かつ ラベル名(下記サンプルのラベル条件は複数指定[OR])
var GMAIL_QUERY = "is:unread label:{ラベル名1 ラベル名2}";
/* ------------------------------------------------------- */

// func: LINE BOT
function pushMessageLineBot( _message ) {
var _postData = {
"messages": [{
"type": "text",
"text": _message,
}]
};

var _url = "https://api.line.me/v2/bot/message/broadcast"; var _headers = { "Content-Type": "application/json", 'Authorization': 'Bearer ' + LINEBOT_CHANNEL_TOKEN, }; var _options = { "method": "post", "headers": _headers, "payload": JSON.stringify(_postData) }; var response = UrlFetchApp.fetch(_url, _options);

}

// func: LINE Notify ※必要であれば
function pushLineNotify(_message){
var _options = {
"method" : "post",
"payload" : {'message' : _message},
"headers" : {"Authorization" : "Bearer "+ LINE_NOTIFY_TOKEN}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", _options);
}

// func: get GMAIL message
function getMessageGmail() {

// Search Gmail with the given query. var _gmailThread = GmailApp.search(GMAIL_QUERY); var _messages = GmailApp.getMessagesForThreads(_gmailThread); var _items = []; for(var _idx = 0; _idx < _messages.length;_idx++){ _items[_idx] = "\n[from]\n" + _messages[_idx].slice(-1)[0].getFrom() + "\n" + "\n[date]\n" + _messages[_idx].slice(-1)[0].getDate().getFullYear() + "/" + _messages[_idx].slice(-1)[0].getDate().getMonth() + "/" + _messages[_idx].slice(-1)[0].getDate().getDate() + " " + _messages[_idx].slice(-1)[0].getDate().getHours() + ":" + _messages[_idx].slice(-1)[0].getDate().getMinutes() + "\n" + "\n[sbject]\n" + _messages[_idx].slice(-1)[0].getSubject() + "\n" + "\n[Message]\n"+ _messages[_idx].slice(-1)[0].getPlainBody() + "\n"; _messages[_idx][0].markRead(); } return _items;

}

// func: main
function main() {
_items = getMessageGmail()
if( _items.length > 0 ){
for( var _idx = ( _items.length - 1) ; _idx >= 0; _idx-- ){
//pushLineNotify( _items[ _idx ] );
pushMessageLineBot( _items[ _idx ] );
}
}
}

試したこと

デパックで以下のところで止まります。

var event = JSON.parse(e.postData.contents).events[0];

調べた結果、エラーメッセージにあるようにpostData が定義されていないからと
思いますが解決方法が見いだせていません。

補足情報(FW/ツールのバージョンなど)

・PC(win10)
・LINEDEVELOPER
・GAS

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

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

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

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

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

itagagaki

2021/08/09 08:02

コードはマークダウンを使って書いてください。 https://teratail.com/help#about-markdown > var event = JSON.parse(e.postData.contents).events[0]; 示されているコードにこの行が含まれていません。 > エラーメッセージにあるようにpostData が定義されていないから 違います。e が定義されていない(undefined)から e.postData がエラーになっています。
退会済みユーザー

退会済みユーザー

2021/08/09 08:07

質問文に記載のエラーメッセージは、doPost関数内でエラーが発生したということを示していますが、doPost関数が質問文中のコードにありません。 どこにエラーの原因があるかわからないので、コードは可能な限りすべて掲載してください。
Thaireo

2021/08/09 08:12

itagagaki様 早速の回答ありがとうございます。 エラーメッセージ張り間違えていました。 以下の内容が表示されました。 Exception: Request failed for https://api.line.me returned code 400. Truncated server response: {"message":"The request body has 1 error(s)","details":[{"message":"May not be empty","property":"messages[0].text"}]} (use muteHttpExceptions option to examine full response)
Thaireo

2021/08/09 08:13

qnoir様 回答ありがとうございます。 エラーメッセージを張り間違えてしまいました。 実際は上記エラーでコードについてはすべて掲載しています。
Thaireo

2021/08/09 08:14

デバックでは下記のところでとまります var response = UrlFetchApp.fetch(_url, _options); }
退会済みユーザー

退会済みユーザー

2021/08/09 08:24 編集

main()関数を、GASエディタ上のデバッガで実行しているのでしょうか? main()関数の _items = getMessageGmail(); の直後に Logger.log(_items); という文を挿入してから、main()をデバッグ実行した場合、ログウィンドウに、(上記のエラー以外に)どのように表示されていますか?
Thaireo

2021/08/09 08:38

GASのデバッガで実行しています。 とまったあとステップオーバー・ステップイン等試しましたが すべてブレークポイントが設定されていませんとなります。
退会済みユーザー

退会済みユーザー

2021/08/09 08:46 編集

では、(main()関数の_items = getMessageGmail();の直後にLogger.log(_items); という文を挿入してから) デバッガ経由ではなく普通にmain()を実行した場合、ログウィンドウに 上記のエラー以外に、どのように表示されますか?
Thaireo

2021/08/09 08:56

mainでデバック実行したら正常に完了しました。 pushMessageLineBotとpushLineNotify(_message)の両方で下記のエラーが出ました。 var response = UrlFetchApp.fetch(_url, _options);
Thaireo

2021/08/09 09:09

GASのデバッガでmainのみを実行したらgmailの内容でlineに通知が届きました。
退会済みユーザー

退会済みユーザー

2021/08/09 09:21 編集

「pushMessageLineBotとpushLineNotify(_message)の両方で下記のエラーが出ました。」 とのことですが、main()だけではなく、「pushMessageLineBot(_message)とpushLineNotify(_message)も、直接実行されたのでしょうか? もしそうなら、main()以外の2つをGAS上で直接実行したりデバッグ実行した際にエラーが出るのは当然です。 なぜなら、引数である_messageがnullの状態でLINE APIにpostすることになるからです。 元のqiitaの記事をよく読んでください。 一定時間ごとに「main()関数を実行」するようトリガーを組んでいます。 main()関数の中では、getMessageGmail()関数が呼び出されています。 getMessageGmail()関数は、GMAILに、ラベル名1またはラベル名2というラベルのついた未読メールがないか調べ、 その条件にあてはまるメールがある場合は、条件に該当するメールの日時や内容をで加工し、 加工したメール一覧を返すようになっています。 そして返されたメール内容の1つ1つがpushMessageLineBot()関数の_messageという引数に渡され、最終的にLINE APIにpostされるようになっています。 なお、条件にあてはまるメールがない場合は、main()関数内の2行目のif文で_items.lengthが0となるため、pushMessageLineBotが実行されず、結局正常に終了することになります。 【テストの正しいやり方】 1、条件にあてはまるGメールを毎回あらかじめ用意してmain()関数を実行する。(なお実行したら対象のメールは既読扱いになり条件から外れます。毎回やるのは面倒ですが) または 2、function pushMessageLineBot( _message ) { の次の行に _message = "テスト文字列"; という文を入れて、pushMessageLineBot()関数を実行する。 (本番運用時は「_message = "テスト文字列";」は削除)
guest

回答1

0

400 Bad Request ということなので、_options の内容をログ出力して間違いを探してみることだと思います。

投稿2021/08/09 08:27

itagagaki

総合スコア8402

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問