ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

QQEnglishのレッスン予約完了メールをGoogleカレンダーに反映させる【Google Apps Script】

オンライン英会話スクール QQEnglish を始めてみました。
始めてみて困ったのが、予約したレッスンを Google カレンダーに登録できる機能がないこと!

Google カレンダー登録用リンク、
かんたんに置けるはずなので置いてほしいところですが、ないものは仕方ありません!
自分で用意しましょう!!

1. まずは出来上がったコードから

Gmail で来たメールに沿って Google カレンダーに登録する、というのは
多くの人がやっているようで、私は以下の記事を参考にしました。

GASを使ってGmailにきた予定をGoogle Calendarに自動で登録する | AABrain

これをベースにしながら、以下のような Google Apps Script を書いてみました。

GmailGoogle カレンダーの権限が必要なので、
トリガーを設定する前に、まずは一度 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 さんが機能追加してくれるのが一番ありがたいですね!