はじめに
LINE Messaging APIのPush APIを用いてメッセージを送信したい場合、userIdを用いて送信するため、友達追加時にuserIdを取得しスプレッドシートに保存しておかなければなりません。
この記事では、友達追加時にuserIdをスプレッドシートへの転記し、もしIDが重複した場合自動で削除するまでの流れを解説していきます。
前提
LINE Messaging APIとGASの紐付けは既に済んでいるものとして進めていきます。
目次
・完成図
・コード全体のサンプル
・解説
完成図
コード全体
コード全体はこんな構図になってます
// LINE Developersに書いてあるChannel Access Token
const access_token = "ここにトークンを入力";
function doPost(e){
//ポストで送られてきたJSONをパース
const event = JSON.parse(e.postData.contents).events[0];
const user_id = event.source.userId;
const eventType = event.type;
const nickname = getUserProfile(user_id);
// botが友達追加された場合に起きる処理
if(eventType == "follow") {
const data = SpreadsheetApp.openById("スプレッドシートのIDを入力").getSheetByName('シートの名前');
const last_row = data.getLastRow();
for(let i = last_row; i >= 1; i--) {
if(data.getRange(i,1).getValue() != '') {
const j = i + 1;
data.getRange(j,1).setValue(nickname);
data.getRange(j,2).setValue(user_id);
data.getDataRange().removeDuplicates([2]);
break;
}
}
}
}
// profileを取得してくる関数(コピペでOK)
function getUserProfile(user_id){
const url = 'https://api.line.me/v2/bot/profile/' + user_id;
const userProfile = UrlFetchApp.fetch(url,{
'headers': {
'Authorization' : 'Bearer ' + access_token,
},
})
return JSON.parse(userProfile).displayName;
}
解説
1.各情報の取得
const user_id = event.source.userId;
const eventType = event.type;
const nickname = getUserProfile(user_id);
ユーザーIDとイベントタイプの取得は公式リファレンスを参照しました。その後、LINEの表示名を取得するためにgetUserProfile関数を呼び起こします。
2.友達追加された場合に起きる処理
if(eventType == "follow") {
const data = SpreadsheetApp.openById("スプレッドシートのIDを入力").getSheetByName('シートの名前');
const last_row = data.getLastRow();
for(let i = last_row; i >= 1; i--) {
if(data.getRange(i,1).getValue() != '') {
const j = i + 1;
data.getRange(j,1).setValue(nickname);
data.getRange(j,2).setValue(user_id);
data.getDataRange().removeDuplicates([2]);
break;
}
}
}
まずスプレッドシートを指定します。スプレッドシートのIDは↓の画像でいうと
1WFnaEsqsOZ46hfx46_gOe-Rp4rf7BEIA_UxC6bDlQ3E
の部分です。各自IDをコピペしてください。
シートの名前は↓のbirthday
とかuser_id
の部分です。
const last_row = data.getLastRow();
次に、getLastRow()
で、最終行を取得しています。
for文の処理
for(let i = last_row; i >= 1; i--) {
if(data.getRange(i,1).getValue() != '') {
const j = i + 1;
data.getRange(j,1).setValue(nickname);
data.getRange(j,2).setValue(user_id);
data.getDataRange().removeDuplicates([2]);
break;
}
}
先ほど取得した最終行の1行下に情報を転記します
const j = i + 1;
data.getRange(j,1).setValue(nickname);
data.getRange(j,2).setValue(user_id);
const j = i + 1;
で最終行の次の行を指定し、そこにsetValueで値を入力しています。
ここで一つ注意点があります。フォローイベントは友達追加時だけでなく、ブロック解除時にも発生するため、その度にIDが転記されてしまいます。そのため、重複した場合に削除するための処理を書かなくてはなりません。
data.getDataRange().removeDuplicates([2]);
.removeDuplicates([2])
という風に書いてあげるだけで簡単に重複を消去できます。
([2]でB列の重複をチェック、[1]でA列の重複をチェックできる)
終わりに
これで無事ユーザーネームとユーザーIDを取得し転記することができました。ここで転記した情報を用いれば様々なBotが作成できそうですね。ちなみに筆者はサークルのメンバーの誕生日がきたら全員に個チャで通知するBotを作成してみました。