LINEを使った1on1促進ツールのプログラミングについて-LINE公式とGoogle Apps ScriptとGoogle スプレッドシートの連携-SUNABACO DX8th&あんとれ1st

みなさん普段からLINEを使ってますか?
LINEをプログラムで動かすことでもっと便利に使えるようになります。

今回は以下2つの機能を実装しました。
・グループチャット内で毎日決まった時間にランダムにメッセージを送信する
→リマインダーとして使える
・公式アカウントがメッセージを受信した時にメッセージとタイムスタンプとユーザーIDを一緒にGoogle スプレッドシートに転記する
→誰がどんなメッセージを送ったかデータベースとして見られる。今回は業務進捗や予定などを管理。


12月9日にSUNABACO DX8th&あんとれ1stを卒業しました。
1ヶ月と2週間の受講期間、ついていくのに大変で挫折しそうになりました。

2週間の卒業制作ではチームの方々のおかげで制作を進めることができ、なんとか完走しました。その中でLINEを使ったツールを作りました。

受講するととてもいい経験になります。チームでやる大人の自由研究といった感じです。詳しくはhttps://sunabaco.com/dx/

今回の卒業制作ではプログラマを担当しました。
どうやって作ったか、順を追って説明していきます。

グループチャット内で毎日決まった時間にランダムにメッセージを送信するBotの作り方

Googleスプレッドシートを用意する

こちらをクリックすると新しいGooleスプレッドシートができます。
シート1のA列に送信したいメッセージを下のように1行に1つ記入してください。

メッセージの例

続いてスプレッドシートIDを確認します。
スプレッドシートのURLのd/と/editの間の文字列がスプレッドシートIDです。後から使うのでそのままページを開いておいてください。

LINE公式アカウントの作成からGoogleAppScript(GAS)の設定

いくつか手順があります。
こちらの記事に詳しくわかりやすく載っています。
https://qiita.com/kanta_yamaoka/items/dd830cf23ff59353824d

記事内の「6.メッセージ自動送信用のGASプロジェクトの実装」の部分のみ記事とは変えます。
下記2件の.gsファイルを作成してください。
以下のコードの【】の部分を上書きして入力してください。

const LINE_TOKEN = '【ここにLINE公式アクセストークンを入力】';
const LINE_ENDPOINT = 'https://api.line.me/v2/bot/message/push';
const LINE_GROUPID = '【ここにLINEグループIDを入力】';


function notifyTheNightBefore() {
  var message = randommessage()[0][0];
  Logger.log(message);
  lineReply(message);
}

// LINEへの応答
function lineReply(replyText) {

  const headers = {
    "Authorization": "Bearer " + LINE_TOKEN,
    'Content-type': 'application/json'
  }
  const messages = {
    "headers": headers,
    "to": LINE_USERID,
    "messages": [{
      "type": "text",
      "text": replyText
    }]
  };
  const options = {
    "headers": headers,
    "payload": JSON.stringify(messages)
  };

  UrlFetchApp.fetch(LINE_ENDPOINT, options);
}

以下のコードのスプレッドシートIDは前に確認したスプレッドシート内の文字列を入力してください。

function randommessage() {
  const File = SpreadsheetApp.openById('【ここにスプレッドシートのIDを入力】');
  const baseSheet = File.getSheetByName('シート1');
  var lastRow = baseSheet.getLastRow();

  var row = Math.ceil(Math.random() * (lastRow-1)) + 1;
  const range = baseSheet.getRange(row, 1);
  console.log(range.getValue());
  return range.getValues(); 
}

続いて記事の「7.GASでの関数の定期実行を設定する」を進めてください。
これでグループチャット内で毎日決まった時間にランダムにメッセージを送信するBotが完成しました。

公式アカウントがメッセージを受信した時にメッセージとタイムスタンプとユーザーIDを一緒にGoogle スプレッドシートに転記するの作り方

先ほど作ったスプレッドシートに新しく投稿という名前のシートを作成してください。

次に先ほど作ったGASプロジェクトに新しい.gsファイルを追加して下記のコードを入力してください。

// スプレッドシートのID
var SPREADSHEET_ID = "【ここにスプレッドシートのIDを入力】";

// シート名
var SHEET_NAME = "投稿";

var CHANNEL_ACCESS_TOKEN = "【ここにLINE公式アクセストークンを入力】";

function doPost(e) {
  var json = JSON.parse(e.postData.contents);

  if (json.events && json.events[0].type === 'message' && json.events[0].message.type === 'text') {
    var userId = json.events[0].source.userId;
    var message = json.events[0].message.text;

    // ユーザーの表示名を取得または保存
    var displayName = getUserDisplayName(userId);

    // テキストメッセージとユーザー名をスプレッドシートに転記
    appendToSpreadsheet(userId, displayName, message);
  }

  return ContentService.createTextOutput(JSON.stringify({}));
}

function appendToSpreadsheet(userId, displayName, message) {
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
  var timestamp = new Date();
  sheet.appendRow([timestamp, userId, displayName, message]);
}

function getUserDisplayName(userId) {
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
  var userRow = findUserRow(userId);

  if (userRow !== -1) {
    // 保存済みの表示名を取得
    return sheet.getRange(userRow, 3).getValue();
  } else {
    // ユーザープロフィールを取得して新しいユーザーを保存
    var userProfile = getUserProfile(userId);
    sheet.appendRow([new Date(), userId, userProfile.displayName, '']);
    return userProfile.displayName;
  }
}

function getUserProfile(userId) {
  var url = 'https://api.line.me/v2/bot/profile/' + userId;
  var options = {
    'headers': {
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN
    }
  };

  var response = UrlFetchApp.fetch(url, options);
  var userProfile = JSON.parse(response.getContentText());

  return userProfile;
}

function findUserRow(userId) {
  var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
  var data = sheet.getDataRange().getValues();

  for (var i = 1; i < data.length; i++) {
    if (data[i][1] === userId) {
      return i + 1; // 行数は1から始まるため
    }
  }

  return -1;
}

以上で受信したメッセージがスプレッドシートに書き込まれていきます。

これでリマインダーとデータベースの作成ができるLINEグループチャットが作成できました。



この記事が気に入ったらサポートをしてみませんか?