はじめに
掲題の小さなプログラムを書いてみました。
Amazonで置き配指定で商品を注文した際、ヤマトのセールスドライバーが荷物を届けてくれると、登録したメールアドレスにヤマトから配達完了メールが届くので、これを検知してスマホに通知->荷物を取りに行く。これを実現したかった、というのが今回のプログラム作成の動機です。
使用技術
- Google App Script (GAS)
- Slack Incoming Webhook
作成したプログラム
作成したのは、下記1ファイルだけの小さなプログラムです。
function myFunction() {
const threads = GmailApp.search('{subject:(お荷物お届け完了のお知らせ) subject:(配達完了:ご注文商品の配達が完了しました。)}');
let unreadMailExists = false;
// 未読メッセージがあるかチェック
for (thread of threads) {
if (thread.isUnread()) {
unreadMailExists = true;
// 既読に更新する
GmailApp.markThreadRead(thread);
}
}
if (unreadMailExists) {
// Slackで配達完了したことを通知
sendSlack("荷物届いたよ!");
}
}
function sendSlack(slackText) {
const userProperties = PropertiesService.getScriptProperties();
const webhookUrl = userProperties.getProperty('webhook_url');
const jsonData =
{
"text": slackText,
"link_names": 1,
"username": "荷物配達完了"
};
const payload = JSON.stringify(jsonData);
const options =
{
"method": "post",
"contentType": "application/json",
"payload": payload
};
// リクエスト
UrlFetchApp.fetch(webhookUrl, options);
}
簡単に解説
- ヤマトの配達が完了すると、「お荷物お届け完了のお知らせ」という件名のメールが届くので、この件名で未読のメールがあれば通知対象とする。(既読なら荷物が届いたことに気づいているので、未読を対象とする)
※(追記)ヤマト以外(日本郵便など)の場合は、Amazonから「配達完了:ご注文商品の配達が完了しました。」の件名のメールが届くことがわかり、件名の条件は複数件にしています。 - 通知対象のメールは既読に更新する。(既読にしておかないと、次に動いたときにまた通知されてしまうため)
- プログラム以外に、SlackとGASで下記の設定を行っています
- Slackの設定
- 任意のワークスペースを作成する
- Slackのアプリケーションページから
incoming-webhooks
を追加・設定する。 - こちら 参考
- GASの設定
- SlackやGASの設定や通知まわりのプログラムは、こちら 参考。
動作確認
荷物の配達が完了していると、下記のメッセージがSlackに通知されます。
リアルタイムではないですが・・下記の流れで荷物の配達完了がわかるようになりました。
- ヤマトのセールスドライバーが配達完了すると、Gmailに配達完了の旨のメールが届く
- 10分間隔のトリガーで今回作成したGASプログラムが起動
- Gmailに未読の配達完了メールがあったらSlackに通知
- スマホのSlackアプリでプッシュ通知をONにしているので、メッセージが通知されると、プッシュ通知され、スマートウォッチが鳴る
- 荷物が届いたことに気づき、玄関に荷物を取りに行く
おわりに
簡単なプログラムですが、これを作ったことで、荷物まだ来てないかなーって何度もメールチェックする手間を減らせたのが良かったです。
あとは、Gmailに新着メール届いたらGAS起動するようにしてリアルタイム検知できればカッコイイけど、そこまで厳密なのは求めていない+GASの実行数が多くなりそう・・なので、10分間隔トリガーに落ち着きました。
また何かちょっとしたプログラムをGASで作ってみたいなと思いました。