Google Apps Scriptと言う便利なスクリプト機能があり、マイコンから送信したデータをGoogleスプレッドシートに記録したり、スプレッドシートの内容を元に何かをしたり、Gmailに届いたメールを元にアクションを起こしたりと言った事が出来る。
例えば、Gmailの新着メールに、特定のキーワードを件名付けたメールが届いたら特定のURLにデータを転送する(それをきっかけにマイコンを動かす)、と言う事が出来る。
ただ、Apps Scriptには制約があり無限に使える訳では無い。一日に実行できる時間(CPU時間)や同時実行数、連続して実行できる間隔など色々制約がある様だが具体的にどの程度動かせるかは実際にやってみないと分からない。一度上限に達すると以降エラーとなり翌日まで動かなくなる。
翌日も日本時間の0時ではないらしく、日本時間の16時過ぎ頃にリセットされている様だ。ただ、これら制限等は記事を書いている時点のもので将来的に変わる可能性は十分ある。
色々試してみた所、以下の新着6件のメールの件名をチェックし、件名に特定のキーワードがあれば本文内容を特定のURLにputデータとして転送するスクリプトを1分毎に実行した場合、月に数回エラーが発生する感じ。
function relaygmailtoaction() {
//Gmailの新着をチェックする
const threads = GmailApp.search('in:Inbox is:Unread',0,6); // 未読新着メール 6通分チェック
if (threads.length == 0) {
Logger.log('新規メッセージなし');
return;
}
//スレッドを一つずつ確認
for (var th in threads){
const messages = threads[th].getMessages();
//スレッド内のメッセージを一つずつ確認
for (var ms in messages){
//const from = messages[ms].getFrom();
const subject = messages[ms].getSubject();
const plainBody = messages[ms].getPlainBody();
const dt = messages[ms].getDate();
//件名が"switchon"の場合に処理する
Logger.log(subject);
if (subject == "switchon"){
messages[ms].markRead(); // メールを既読に設定する
//日付時刻を追加
let msg = "|" + dt.getMonth() + "/" + dt.getDate() + " " + ('00'+dt.getHours()).slice(-2) + ":" + ('00'+dt.getMinutes()).slice(-2) + " " + plainBody;
//Blynkにデータを送信する
const webhookUrl = "http://testsampleserver/action";
const payload = '["'+msg.replace(/[\t\r\n]/g,"").trim()+'"]';//JSON.stringify('["'+msg+'"]');
Logger.log(payload);
const options = {
'method': 'put',
'headers': {
'Content-Type': 'application/json'
},
'payload': payload
};
UrlFetchApp.fetch(webhookUrl, options);
Logger.log('メッセージ処理');
return;
}
};
};
Logger.log('対象メッセージなし');
}
チェックする新着の件数を増やす場合は実行間隔を広げる。エラーが発生している場合エラー通知を設定していればメールで届くし、スクリプトのログでも確認できる。
ログには実行時間も記録されているが、チェックするメール件数を増やすと実行時間がたまに60秒とか急に増えている事があるので、ちょっとした変更が実行時間に大きな影響を与える事もある様だ。