QQEnglishのレッスン予約完了メールをGoogleカレンダーに反映させる【Google Apps Script】
オンライン英会話スクール QQEnglish を始めてみました。
始めてみて困ったのが、予約したレッスンを Google カレンダーに登録できる機能がないこと!
Google カレンダー登録用リンク、
かんたんに置けるはずなので置いてほしいところですが、ないものは仕方ありません!
自分で用意しましょう!!
1. まずは出来上がったコードから
Gmail で来たメールに沿って Google カレンダーに登録する、というのは
多くの人がやっているようで、私は以下の記事を参考にしました。
→ GASを使ってGmailにきた予定をGoogle Calendarに自動で登録する | AABrain
これをベースにしながら、以下のような Google Apps Script を書いてみました。
Gmail と Google カレンダーの権限が必要なので、
トリガーを設定する前に、まずは一度 Google Apps Script エディターから手動実行をして権限の許可 をするようお願いします。
【QQEnglish のレッスン予約完了メールを元に、Googleカレンダーのスケジュールを作成】
2. 指定した文字列を含む件名のメールを抽出
ポイントは
const targetHours = 1; const subject = "【QQEnglish】レッスン予約完了"; const query = (`newer_than:${targetHours}h subject:"${subject}"`); const threads = GmailApp.search(query);
のところでしょうか。
Gmail の検索で特定のメールを引っ張ってくる必要があるので、
件名を指定して取得します。
ただ、予約完了のメールの件名が変わる可能性が将来的にあるのがつらいところ……。
newer_than:1h
で、1時間以内のメールのみ取得するようにしています。
ここは後述する重複スケジュール作成の防止があるので、もっと長い時間にしても大丈夫です。
クエリには他にもいろいろなものがあります。 ↓
https://support.google.com/mail/answer/7190?hl=ja
from:noreply@notify.qqeng.com
などを加えてもいいかもしれませんね。
const threads = GmailApp.search(query); const messagesEachThreads = GmailApp.getMessagesForThreads(threads); messagesEachThreads.forEach(messages => { messages.forEach(message => { const messageSubject = message.getSubject(); if (!messageSubject.includes(subject)) return;
GmailApp.search
で取得できるものはスレッド一覧なので、
そこからさらに、スレッドごとのメール一覧を取得してきて、
各メールの件名をチェックするというところまでやって初めて、
一致する件名のメールを取得できるという仕組み に注意が必要です。
3. Google カレンダーにスケジュール登録
GASを使ってGmailにきた予定をGoogle Calendarに自動で登録する | AABrain の記事にあるコードを使わせてもらいつつ、
場所の設定は必要ないので location のオプションは削除しつつ、
同じ時間に同じタイトルのスケジュールがすでにあるなら作らない ようにしました。
これがなんであるかというと、 Gmail がレッスン予約のメールを同じスレッドに入れてしまうことがあるためです。
私の場合、4/19 21:00 と 4/20 8:00 に送られた予約完了メールが同じスレッドに入っていました。
そうなると、4/20 8:00 のメールだけ見てほしいのに、4/19 21:00 のメールも見てしまって、一度作ったスケジュールがもう一度作られてしまいます。
それを防ぐため、重複登録の防止処理を入れています。
4. 便利になりました!
これで、レッスン予約をすると勝手に Google カレンダーに予定登録されるようになりました! とっても便利です。
問題は、メールの件名や文章が変わるとこのコードが動かなくなることですね……。
レッスンの開始時間や先生の名前などは、メールの文章から正規表現で取ってきているので……。
限界があるので、QQEnglish さんが機能追加してくれるのが一番ありがたいですね!