Integromat無料枠を使ってZoomミーティングの招待をメール一斉送信

予定が決まっているZoomミーティングの招待メールを一斉送信する方法について考えました。条件は以下の通りです。（注：結果としてZoomとの連携をしていませんが，同じ用途での利用方法を探している人のために件名にZoomを加えています）

- ミーティング参加者は予めリストになっている
- 参加者によって参加するミーティングが異なる
- 招待メールの件名は都度異なる
- 招待メールの本文はすべて同じでよい
- 参加者，ミーティング予定は関係者が誰でも編集できるようにする
- 有料のサービスは利用できない

以下の方法で実現することにしました。

- Googleスプレッドシート
 - シート（ミーティングリスト）にミーティング予定を登録
 - シート（参加者リスト）に参加者とメールアドレスを登録
- Integromat（インテグロマット）無料プラン
 - 毎日8時から20時まで，1時間に1回稼働
 - 1000オペレーション/月に収まるよう設計
- Gmail
 - BCCで一斉送信
 - IntegromatのGmail連携にはAPIの公開手続きが必要（今回は手順省略）
 - Gmailの代わりにSMTP送信できるメールアカウントを用意するほうが楽かも

# Googleスプレッドシート
スプレッドシートの名称は**「Zoomミーティングリスト」**とします。
以下のシートを作成します。

- ミーティングリスト
- 参加者リスト

## ミーティングリスト

|列|列名|例|備考|
|:-:|:--|:--|:--|
|A|区分|昼礼|後述の参加者リストの「参加対象」で使用する|
|B|日付|2020/11/16|ミーティングの日付|
|C|通知時間|13|招待メールを送信したい時間。Integromatのスケジュールを8時0分から開始するよう設定するので，通知時刻を13にすれば，13時0分頃にメール送信される。|
|D|件名|昼礼の招待|メールの件名|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/c2418d34-a8e2-06c2-fb79-7999599497ec.png)

## 参加者リスト

|列|列名|例|備考|
|:-:|:--|:--|:--|
|A|氏名|山田太郎|連携では使用しないが，リスト管理に便利|
|B|メールアドレス|tarochan@example.com|メール送信先|
|C|参加対象|朝礼,特別|ミーティングリストの区分と一致するとメール送信の対象となる。半角コンマ区切りで複数設定できる。<br>ただし，Integromatのフィルター処理ではオペレーション節約のため Contain を使う。仮に区分を「礼」などと登録すれば，朝礼と昼礼の両方が一致してしまうので注意。|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/26ebec4d-7fe6-197b-5421-f2408d48f832.png)

# Integromatシナリオ
以下のようなシナリオを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/20599554-8467-98e5-ab2a-5614a7280731.png)

### Googleスプレッドシート SearchRows：ミーティングリスト
Googleスプレッドシートとの連携にはConnectionが必要です。Googleスプレッドシート：SearchRowsモジュールを追加した後，Addをクリックして連携してください。
次いで，以下のような設定にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/29269ffd-fca1-5ca4-bcf1-ac44ea0635e9.png)

さらにフィルターを設定します。

|対象|operator|値|
|:-:|:--|:--|
|区分(A)|Exists(Basic)||
|日付(B)|Later than or equal to(Datetime)|{{parseDate(formatDate(now; "YYYY-MM-DD 0:00"); )}}|
|日付(B)|Earlier than or equal to(Datetime)|{{parseDate(formatDate(now; "YYYY-MM-DD 23:59"); )}}|
|通知時間(C)|Equal to(Numeric)||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/5ef46f02-619d-5273-fb32-22b9b1ef3303.png)

**リスト取得後のフィルター処理**
ミーティングリストの取得件数が0件の時に次の動作に移動してしまうのを防ぐため，フィルター処理を追加します。

|対象|operator|値|
|:-:|:--|:--|
|区分(A)|Exists(Basic)||

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/34337046-c7ae-3685-3b7f-5fb44cb0e01b.png)

### Googleスプレッドシート SearchRows：参加者リスト
上記と同じくGoogleスプレッドシート：SearchRowsモジュールを追加し，以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/c15ac39e-53f3-fdd9-b79d-88e5a2e59499.png)

さらにフィルター設定します。

|対象|operator|値|
|:-:|:--|:--|
|参加対象(A)|Contains|区分(A)|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/60229505-b539-b8ed-03c3-b1eda1697e8f.png)

### Array aggregator：ループ停止
ループを停止しないとオペレーション数が増えるので，ここでループを停止します。
後でArray（配列）として使用するので，Aggregationd Fieldの「メールアドレス」のみチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/33dfcadb-264d-f921-640a-b38505ae498b.png)

### Gmail(EMail)
Gmailモジュールを追加します。Connectionが必要ですが，IntegromatのGmail連携は2020年6月以降，Google側のセキュリティ強化に伴い，Gmail APIの公開が必要です。手間がかかるので，SMTPで送信する手段があるならEMailモジュールを使うのもおすすめです。
https://support.integromat.com/hc/en-us/articles/360013972700

To（送信先）には送信者自身のメールアドレスなど，参加者に知られてもよいメールアドレスを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/e921a650-ed34-a476-d128-007be21da77d.png)
Subject（件名）にはミーティングリストから取得した件名を選択します。
Content（本文）は毎回同じという前提なので，直接入力します。本文をミーティングごとに変えたいなら，件名同様にミーティングリストに列を追加することができます。ただし本文は複数行なのでリストが見づらくなります。それ以外の方法だとオペレーション回数が増えるので，今回はあきらめます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/08b42ff1-9dda-24cf-4266-c419f65679bb.png)
"Show adavanced settings"にチェックを入れます。Blind copy recipident(BCC)を以下のようにします。値を設定する前にmapをオンにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/d182ed2e-517f-1931-dcb0-26408115b454.png)
`{{map(8.array; 1)}}`
Array[]は選択で入力できます。
※8.arrayの8の部分は同じにならないかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/ebcdb6eb-595b-28c6-f997-8dbf8f2af7bd.png)

### スケジュール設定
以下のように設定します。

|対象|値|備考|
|:--|:--|:--|
|Run scenario|At regular intervals|定期実行|
|Minutes|60|1時間に1回実行|
|Time from|08:00|8時から実行|
|Time to|20:59|8時59分で終了|
|Days|Monday-Sunday|全曜日を選択|
|Months|January-Decembar|全月を選択|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/ab1dbe50-0835-fd52-8832-c4d45212af36.png)

これで，以下のように動作します。

- 8時から20時まで，各時間帯の0分に作動
- 1日に12回作動
- 例：1日に2回ミーティングがある場合
 - 空振り10回：オペレーション 310回/月
 - メール送信2回：オペレーション 248回/月
 - 合計：オペレーション 558回/月

最後に，SCHEDULINGをオンにして稼働開始です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102503/47364412-6fa9-639c-c831-904d16ebeb9f.png)