12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

はじめに

LINE Notifyを使用してReminderを通知するBOTを作成しました。
2.png

スプレッドシートにReminderの実行時刻とメッセージを指定します。
(※A列は、毎日または毎週月のように曜日を指定します。)
1.png

GoogleAppsScript(GAS)にて1日1回、スプレッドシートから当日分のリマインダーをトリガーに登録します。

登録されたトリガーから、指定された時刻にプログラムを実行します。そのプログラムでは、スプレットシートから取得したメッセージをLINE Notifyに通知します。

LINE Notify

GoogleAppsScript

  1. GoogleAppsScriptを開いて、以下のスクリプトを実装します。LINE_NOTIFY_TOKENにLINE Notifyで発行したトークンを指定する。
  2. SSID_REMAINDERにスプレッドシートのIDとSSN_REMAINDERにシート名を指定する。
main.gs
/**
 * リマインダーBOT
 */
const LINE_NOTIFY_TOKEN = '*****'; // LINE NOTIFYのアクセストークン
const SSID_REMAINDER = '*****'; // リマインダーのスプレッドシートのID
const SSN_REMAINDER = 'line_trigger'; // リマインダーのスプレッドシートのシート名
const WEEKDAY = ["", "", "", "", "", "", ""];

let spreadsheet = SpreadsheetApp.openById(SSID_REMAINDER);
let sheet = spreadsheet.getSheetByName(SSN_REMAINDER);

/**
 * メイン処理
 */
function main() {
    try {
        deleteTrigger();
        let nowDt = new Date();

        let itemList = getItemList();
        for (let i in itemList) {
            let item = itemList[i];

            if (item.type == `毎週${WEEKDAY[nowDt.getDay()]}` ||
                item.type == '毎日') {

                let trigger = setTrigger(item.time);
                sheet.getRange(parseInt(i) + 1, 4).setValue(trigger.getUniqueId());
            }
        }
    } catch (e) {
        console.error(e.stack);
    }
}

/**
 * メッセージを通知する
 * @param {Object} e
 */
function notify(e) {
    try {
        console.log(`notify: triggerUid=${e.triggerUid}`);

        let itemList = getItemList();
        for (let i in itemList) {
            let item = itemList[i];
            if (item.triggerId == e.triggerUid) {
                sendLineNotify(`\n${item.message}`);
            }
        }
    } catch (e) {
        console.error(e.stack);
    }
}

/**
 * トリガーを設定する
 * @param {String} time 
 * @return trigger
 */
function setTrigger(time) {
    let arr = time.split(':');
    var date = new Date();
    date.setHours(arr[0]);
    date.setMinutes(arr[1]);
    return ScriptApp.newTrigger('notify')
        .timeBased()
        .at(date)
        .create();
}

/**
 * トリガーを削除する
 */
function deleteTrigger() {
    let triggerList = ScriptApp.getProjectTriggers();
    for (let i in triggerList) {
        let trigger = triggerList[i];
        if (trigger.getHandlerFunction() == 'notify') {
            ScriptApp.deleteTrigger(trigger);
        }
    }
}

/**
 * スプレッドシートのデータを取得する
 * @return itemList
 */
function getItemList() {
    let itemList = [];
    let lastRow = sheet.getLastRow();
    if (0 < lastRow) {
        itemList = sheet.getRange(1, 1, lastRow, 4).getValues();
        itemList = itemList.map((row) => {
            return {
                type: row[0],
                time: row[1],
                message: row[2],
                triggerId: row[3],
            }
        });
    }
    return itemList;
}

/**
 * LINEにメッセージを送信する
 * @param {String} message メッセージ 
 */
function sendLineNotify(message) {
    let url = 'https://notify-api.line.me/api/notify';
    let options = {
        'method': 'post',
        'headers': {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Authorization': `Bearer ${LINE_NOTIFY_TOKEN}`
        },
        'payload': `message=${message}`
    };
    let response = UrlFetchApp.fetch(url, options);
    return JSON.parse(response.getContentText('UTF-8'));
}
  • main関数を1日1回実行します。日付が変わった後の時間帯が望ましいです。トリガー登録時にトリガーIDをスプレットシートに保存します。
  • 登録されたトリガーから、指定された時刻にnotify関数が実行されます。実行時のトリガーIDから、通知対象のメッセージを取得します。

参考リンク

さいごに

ソースコードをGitHubに公開しています。

以上です。

12
0
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
12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?