【GAS】#9 スプレッドシートの明日のシフト表より当番や時間を取得し、ラインに通知する

1. 概要

SpreadSheet to Line

明日のシフト表を確認し、下記内容をLineへ通知する。

  • 当番
    • 名前
  • 時間
    • 開始 ~ 終了

本記事では「API連携」による通知について解説します。

2. LINE Messaging APIの準備

2-1. 「LINE Developers」にアクセス

  • 「ログイン」をクリック

2-2 LINEアカウントでログイン

2-3. 「LINE Developers Account」を作成

2-4. 「Provider」を作成

2-5. 「Channel」を作成

2-6. 「User ID」を取得

2-7. 「Access Token」を取得

3. サンプルコード

3-1. ファイル構成(GitHubで管理

  • notification/line/shift_table_to_line.gs
    • メインコード
  • notification/slack/gas_properties.gsheet
    • 「WebHook URL」を含め、コード内に書かない方が良いデータ(ID、PASSWORD、KEY等)をプロパティとして保存

3-2. スプレッドシートIDの取得

3-3. GAS Editorの開け方

※「+新規」をクリック

3-4. コード & 解説

※複数のプログラムよりプロパティファイルを共有する為、敢えてスタンドアロン型(*5-2)を採用する

// プロパティ情報が記載されているスプレッドシートのID
const bookId = '1j2z-S●●●●●●●●●●●●●●●●●●●●●●●●●●●●cQk';

// Mainメソッド
// スプレッドシートの明日のシフト表より当番や時間を取得し、ラインに通知
const main = () => {
  // 日付
  const sheetName = getTomorrow('MM-dd');
  const targetSheet = getTargetSheet(sheetName);
  const listOfShift = getListOfShift(targetSheet);
  sendToLine(listOfShift);
}

// シフトのリストを抽出
const getListOfShift = (targetSheet) => {
  const date = getTomorrow('MM月dd日');
  let listOfShift = `【${date}】シフトのお知らせです。`;
  for (let rowNo = 3; rowNo < 7; rowNo++) {
    const nameAndTime = findNameAndTime(targetSheet, rowNo);
    listOfShift = `${listOfShift}\n${nameAndTime}`;
  }
  return listOfShift;
}

// 明日の日付を返す
const getTomorrow = (format) => {
  // 今の日付
  const date = new Date();
  // 明日の日付
  date.setDate(date.getDate() + 1);
  return Utilities.formatDate(date, 'JST', format);
}

// 名前と時間を検索
const findNameAndTime = (targetSheet, rowNumber) => {
  const ranges = targetSheet.getRange(`C${rowNumber}:P${rowNumber}`).createTextFinder('●').findAll();
  const name = targetSheet.getRange(`B${rowNumber}`).getValue();
  const cellOfStartTime = ranges[0].getA1Notation().replace(rowNumber, '2');
  const cellOfEndTime = ranges[ranges.length - 1].getA1Notation().replace(rowNumber, '2');
  const startTime = targetSheet.getRange(cellOfStartTime).getValue();
  const endTime = targetSheet.getRange(cellOfEndTime).getValue();
  return `●${name}:${startTime}時~${endTime}時`;
}

// シフト表用スプレッドシート
const getTargetSheet = (sheetName) => {
  const spreadsheetId = getValueOfProperty('D29');
  return SpreadsheetApp.openById(spreadsheetId);
}

// 指定のスプレッドシートに記載されているプロパティの値を取得
const getValueOfProperty = (cell) => {
  const sheet = SpreadsheetApp.openById(bookId).getSheetByName('Properties');
  return sheet.getRange(cell).getValue();
}

// メッセージをLineへ通知
const sendToLine = (msg) => {
  // Message Push API Url
  const targetUrl = getValueOfProperty('C29');
  // アクセストークン
  const accessToken = getValueOfProperty('E29');
  // BotユーザーID
  const to = getValueOfProperty('F29');

  const headers = {
    'Content-type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + accessToken,
  };

  const param = {
    'to': to,
    'messages': [
      {
        'type': 'text',
        'text': msg,
      },
    ],
  };

  const payload = JSON.stringify(param);

  const options = {
    'method': 'post',
    'headers': headers,
    'payload': payload,
  };

  UrlFetchApp.fetch(targetUrl, options);
}

4. 実行結果例

【シフト表】

※今日が【9月5日】の場合

【Line】

5. 参考

5-1. GAS(Google Apps Script)とは

5-2. 2種類の方式

5-3. Web APIとは

5-4. 「UrlFetchApp.fetch()」について

関連記事

  1. 【GAS】#10 ウェブアプリのフォーム入力からスプレッドシートへ記載…

  2. 【GAS】#4 OCRにて画像からテキストを起こし、Lineへ通知する…

  3. 【GAS】#8 TwitterのPublic Metricsデータを取…

  4. 【GAS】#1 Gmailに届いた新着メールをSlackに通知する

  5. 【GAS】#11 Twitterの話題を検索し、スプレッドシートに記載…

  6. 【GAS】#6 ブログにて発信しているユーザーを月毎に集計し、Slac…