LoginSignup
14
18

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-11-14

はじめに

 LINE Messaging APIのPush APIを用いてメッセージを送信したい場合、userIdを用いて送信するため、友達追加時にuserIdを取得しスプレッドシートに保存しておかなければなりません。
 この記事では、友達追加時にuserIdをスプレッドシートへの転記し、もしIDが重複した場合自動で削除するまでの流れを解説していきます。

前提

LINE Messaging APIとGASの紐付けは既に済んでいるものとして進めていきます。

目次

・完成図
・コード全体のサンプル
・解説

完成図

個人情報保護のため画像の一部を加工しています
スクリーンショット 2019-11-13 19.25.26.png

コード全体

コード全体はこんな構図になってます

コード.gs
// 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をコピペしてください。
スクリーンショット 2019-11-15 1.15.29.png

シートの名前は↓のbirthdayとかuser_idの部分です。
スクリーンショット 2019-11-15 1.12.29.png

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を作成してみました。

14
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
18