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

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

解決済

1回答

452閲覧

複数の端末に同様のメッセージを送りたい

momokoko

総合スコア38

LINE Messaging API

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

Google Apps Script

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

0グッド

1クリップ

投稿2020/06/03 13:19

作ったLineBotの概要です。
・LineからGmailにあるメールを取得
・gmail上でラベル指定し、受信するメールを選択
・届いたメールをLINEに通知する

実現したいこと
・LINEbotを登録した複数の端末で同じ内容のgmailを受信したい

自分の携帯では思い通りの動きになったのですが、別の携帯に登録したところメールは届きませんでした。
自分なりに調べたところ、下記のコードで一人のユーザーに送信する設定になっているかなと思いました。

var options = { "method" : "post", "headers" : { "Content-Type" : "application/json", "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN }, "payload" : JSON.stringify(postData) }; UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options); }

ドキュメントを読んでもどう編集したらいいのかもよくわかりませんでした。

また、Udemyで言われて通り作っただけなので、ほとんど知識はありません。

以下は全コードです。
google app scriptに貼り付けています。

ご教授いただけると嬉しいです。
よろしくお願い致します。

var CHANNEL_ACCESS_TOKEN = '********'; var LINE_USER_ID = '********'; var spreadsheet = SpreadsheetApp.openById('********'); //doPost関数(Lineからメッセージを受け取って設定変更) function doPost(e) { var replyToken = JSON.parse(e.postData.contents).events[0].replyToken; if (typeof replyToken === 'undefined') { return; } var messageText = JSON.parse(e.postData.contents).events[0].message.text; var cache = CacheService.getScriptCache(); var type = cache.get("type"); if (type === null) { //ラベル一覧取得 if (messageText === "ラベル") { cache.put("type", 1); var labels = GmailApp.getUserLabels(); reply_push(replyToken, "現在あるラベル一覧です。"); for(var n in labels) { if(labels[n].getName() != 'LineBot'){ labels_push(labels[n].getName()); } } labels_push("受信するラベルを教えてください。\n設定をキャンセルする場合は「キャンセル」と送ってください。"); } else if (messageText === "確認") { //設定確認 cache.put("type", 2); var cell = spreadsheet.getActiveSheet().getRange("A1").getValue(); if(cell === ''){ reply_push(replyToken, "すべての受信メールをLineで通知する設定です。\n設定を変更しますか?\n「はい」「いいえ」"); }else{ reply_push(replyToken, "ラベル名「"+cell+"」の受信する設定になっています。\n設定を変更しますか?「はい」「いいえ」"); } } else if (messageText === "全部") { //すべてのメール受信設定   spreadsheet.getRange("B1").setValue('all');   spreadsheet.getRange("A1").clear(); reply_push(replyToken, "すべての受信メールをLineで通知します。"); } else { //操作方法説明 reply_push(replyToken, "「全部」\nと送るとすべてのメールをLineで通知。\n「ラベル」\nと送ると受信するラベル設定。\n「確認」\nと送ると現在の設定を確認。"); } }else{ if (messageText === "キャンセル") { cache.remove("type"); reply_push(replyToken, "設定をキャンセルをしました"); return; } switch(type) { case "1": // ラベルの設定 var labels = GmailApp.getUserLabels(); for(var n in labels) { if(labels[n].getName() === messageText){ if(messageText === 'LineBot'){ var body = 'LineBotラベルはBotが使用するラベルになります。\n他のラベル名を送ってください。\nキャンセルの場合は「キャンセル」と送ってください。'; }else{ var messageText = hankakuhenkan(messageText); spreadsheet.getRange("A1").setValue(messageText); spreadsheet.getRange("B1").clear();    var cell = spreadsheet.getActiveSheet().getRange("A1").getValue(); var body = "「"+cell+"」ラベルのメールを受信設定しました。"; cache.remove("type"); break; } }else{ var body = 'ラベルが一致しません。\n存在するラベルを送ってください。\nキャンセルの場合は「キャンセル」と送ってください。'; } } reply_push(replyToken, body); break; case "2": //設定確認からの設定変更 if (messageText === "はい") { cache.remove("type"); reply_push(replyToken, "「全部」\nと送るとすべてのメールをLineで通知。\n「ラベル」\nと送ると受信するラベル設定。"); } else if (messageText === "いいえ") { cache.remove("type"); reply_push(replyToken, "このままの設定です。"); } else{ reply_push(replyToken, "「はい」か「いいで」でお答えください。"); break; } break; } } } // replay返信 function reply_push(replyToken, messageText) { var url = "https://api.line.me/v2/bot/message/reply"; UrlFetchApp.fetch(url, { "headers": { "Content-Type": "application/json; charset=UTF-8", "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN, }, "method": "post", "payload": JSON.stringify({ "replyToken": replyToken, "messages": [{ "type": "text", "text": messageText, }], }), }); return ContentService.createTextOutput(JSON.stringify({"content": "post ok"})).setMimeType(ContentService.MimeType.JSON); } // ラベル用プッシュ通知 function labels_push(messages1) { var postData = { "to": LINE_USER_ID, "messages" : [ { "type" : "text", "text" : messages1 } ] }; var options = { "method" : "post", "headers" : { "Content-Type" : "application/json", "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN }, "payload" : JSON.stringify(postData) }; UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options); } function hankakuhenkan(val) { var regex = /[A-Za-z0-9!"#$%&'()*+,-./:;<=>?@[\]^_`{|}]/g; value = val .replace(regex, function(s) { return String.fromCharCode(s.charCodeAt(0) - 0xfee0); }) .replace(/[‐-―]/g, "-") // ハイフンなど .replace(/[~?]/g, "~") // チルダ .replace(/ /g, " "); // スペース return value; }
var CHANNEL_ACCESS_TOKEN = '********'; var LINE_USER_ID = '********'; var spreadsheet = SpreadsheetApp.openById('********'); var cell = spreadsheet.getActiveSheet().getRange("A1").getValue(); var date = new Date() ; var unixTime = date.getTime();//UNIX TIMEに変換 var now = Math.floor(unixTime/1000); var term = now - 300; //Gmailのafterフィルター用 現在時刻から5分(300秒)前 var tereEnd = now - 120; //スレッド受信時間用 現在時刻から2分前(120秒)前 function getMail(){ //指定した内容でメール受信 if(cell === ''){ var FindSubject = '-label:LineBot after:'+term; }else{ var FindSubject = '-label:LineBot label:'+cell+' after:'+term; } var myThreads = GmailApp.search(FindSubject,0,1); //スレッドからメールを取得し二次元配列に格納 var myMessages = GmailApp.getMessagesForThreads(myThreads); var target_label = 'LineBot'; var mail_by_label = GmailApp.getUserLabelByName(target_label); if(!mail_by_label){ GmailApp.createLabel('LineBot'); } for(var i=0;i<myMessages.length;i++){   for(var j=0;j<myMessages[i].length;j++){ var strDate = myMessages[i][j].getDate(); var strSubject = "タイトル["+myMessages[i][j].getSubject()+"]\nスレッド番号["+j+"]"; var strMessage = myMessages[i][j].getPlainBody().slice(0,200); var mailID = myMessages[i][j].getId(); var mailURL = "https://mail.google.com/mail/mu/mp/362/#cv/priority//"+mailID; var mailunixTime = strDate.getTime();//UNIX TIMEに変換 var mailTime = Math.floor(mailunixTime/1000); //ミリ秒を秒に変換 if(tereEnd < mailTime){ //LINEにメッセージを送信 line_push(strSubject,strMessage,mailURL);   //通知済みのメッセージにラベルをつける var label_treated = GmailApp.getUserLabelByName('LineBot'); myThreads[i].addLabel(label_treated); } }  } } // LINEにプッシュ通知する function line_push(messages1,messages2,messages3) { var postData = { "to": LINE_USER_ID, "messages" : [ { "type" : "text", "text" : messages1+"\n\n" + messages2 + "\n\n<メールを開く>\n" + messages3 } ] }; var options = { "method" : "post", "headers" : { "Content-Type" : "application/json", "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN }, "payload" : JSON.stringify(postData) }; UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

エンドポイントをmulticastに変更し、toに配列を指定することで、複数ユーザーに同時配信できます。

JavaScript

1const users = ["U....1", "U....2", "U....3"]; 2 3const postData = { 4 to: users, 5 messages: ["送信するメッセージテキスト"], 6}; 7 8var options = { 9 method: "post", 10 headers: { 11 "Content-Type": "application/json", 12 Authorization: "Bearer " + CHANNEL_ACCESS_TOKEN, 13 }, 14 payload: JSON.stringify(postData), 15}; 16 17//エンドポイントを変更(push -> multicast) 18//UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options); 19UrlFetchApp.fetch("https://api.line.me/v2/bot/message/multicast", options); 20

投稿2020/06/04 04:02

draq

総合スコア2573

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

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

momokoko

2020/06/04 09:52

回答ありがとうございます! 頂いたコードを自分のコードに適応できるように編集したのですが、 const users = ["U....1", "U....2", "U....3"]; こちらはこのままコピー&ペーストでよろしかったでしょうか?
draq

2020/06/04 10:13

いえそこは送信するユーザーIDの配列を設定してください。 下の長いソースの中のlabels_pushとline_pushの中の "to": LINE_USER_ID となっている部分を、LINE_USER_ID2等を必要に応じて定義した上で "to": [LINE_USER_ID, LINE_USER_ID2, LINE_USER_ID3, ..., LINE_USER_ID9] の様に、必要なだけ増やしてください。
momokoko

2020/06/04 10:40

返信ありがとうございます! LINE_USER_IDはLINE Developersから自分のuser_idをコピペしましたが、他の端末のLINE_USER_IDはwebhook等を利用し、取得すれば良いのでしょうか?
draq

2020/06/04 11:45

そうです。
momokoko

2020/06/04 16:32

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問