IFTTT(Pro)を自分の好きな間隔で定期的に（言い換えれば最短5分周期で）呼び出す方法

# はじめに

皆がIFTTTの有料化でボイコットしている時に、呑気に$1.99でProをサブスクライブしてエントリーしたのが自分だけだったのかもしれませんが……「[Applet of the Week](https://ifttt.com/explore/created_applet_of_the_week_2)」というIFTTが開催する小イベントで賞を頂きました。（日本のAmazonでは逆立ちしても使えないんですが）$500のAmazonギフト券をもらったので、気を良くして幾つかIFTTT絡みの記事を書いてみます。

本記事の内容を実現するには恐らくProプランが必要です。済みません。

# IFTTTを定期的に実行する

IFTTTではトリガーと呼ばれるアプレットが動作する「きっかけ」になるイベントを1つ選ぶことになっています。これがIFTTTの「IF Then」の部分になっています。例えば以下のような具合です。

1. メールを着信したら
2. 天気が変わったら
3. 日が暮れたら
4. スプレッドシートがアップデートされたら

といった具合です。
これらはイベントドリブン（何かが起きたら）と呼ばれるトリガーですが、中には定期的に実行したい場合もあります。例えば以下のような場合です。

1. 一定期間、体重計に乗っていないのか（いるのか）を定期的にチェックしたい
2. 毎日5時（定期的）になったら電気をつけたい

# IFTTTを定期的に実行する標準的な方法


そんな時に使えるのが、「[Date & Time](https://ifttt.com/date_and_time)」というトリガーウィジェットになります。「おぉ便利、これでサクサクバンバンとアクションを呼び出せるね」と思った方には残念なお知らせがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/7e0bd359-e8ad-2311-efe9-2514e9f44ead.png)

なんとこちらのトリガーで実現出来る最短呼び出し期間は15分単位なのです。これはProプランになっても変わりません。これで十分な場合もありますが、不十分と感じることもしばしばあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/fe4613b5-b9dd-3cb1-a143-b581071f853a.png)

# （やっぱり）GASを使って最短5分単位でIFTTTをトリガーする

そこで登場するのがGAS（Google Apps Script）です（私の記事ではレギュラーメンバーとなっておりますが……）
早速、5分間隔でもIFTTTのアクションを動作させられる方法をご紹介していきます。

1. 先ずは何はなくともGoogle DriveにてGoogle Spread Sheetを作成します。
2. 作成したシートのツールバーから[ツール]>[スクリプトエディタ]を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/9c4cb492-61a5-86ec-39f4-6b1ce63f7346.png)
3. 簡単なスクリプトを書きます。コピペでOKです。


```javascript:Every5Minutes.gs
function Every5Minutes() {
  var mySheet = SpreadsheetApp.getActiveSheet();
  mySheet.getRange(1, 1).setValue(new Date());
}
```
A1セルの内容に現在時刻（実行時時刻）を書き込むだけの単純なメソッドとなっています。

4. ツールバーからトリガーボタンをクリックして、トリガーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/278dac49-e679-1e9a-d079-fe88b05bad85.png)

実行する関数は前項で作成した関数（メソッド（前項の例では`Every5Minutes()`））を指定します。トリガーの条件はご覧の通り1分単位で指定出来ます。ただ、後述の通りProプランでさえも`Polling Applets usually run within 5 minutes`と書かれているので4分以下の周期では動作しないものと想定されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/4da6532c-6f83-ccfa-c37c-b5d9207d79dc.png)

ここまでで、指定した時間間隔で特定のGoogle Spread Sheetの特定のセル（ここではA1）をアップデートする仕組みが出来上がりました。

#IFTTTのトリガーとして利用

IFTTTでは定期的に変更される「特定のGoogle Spread Sheetの特定のセル」をトリガーとして利用します。
具体的には、トリガーウィジェットとしてGoogle Sheetを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/e244c115-8b11-8984-e6d2-f201bdda5276.png)
詳細メソッド（と呼ぶかどうか分かりませんが）では、`Cell updated in spreadsheet`を選びます。これが正に「特定のGoogle Spread Sheetの特定のセルがアップデートされたら」というウィジェットになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/99f9382b-10fc-43fd-4c34-e1971557b783.png)
条件には前段で作成したGoogle Spread Sheetのパス、ファイル名、セル（A1）を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206965/edae7374-e1ee-71d4-3f12-dfaf8d153a60.png)

これにて晴れて指定した間隔で、最短5分間隔でIFTTTを稼働させることが出来るようになりました。私はIFTTT側の負荷も鑑みて5分単位でしか動作させたことがありません。それ以下での動作については確認しておりません。

#その他の方法（余談）

GASの`UrlFetchApp.fetch(URL[, パラメータ])`を利用して、IFTTT側はWebHookで受けるという方法もありますが、以下の理由から単純に定期呼び出しが目的なのであれば避けた方が良いでしょう。

1. 1日2万回という[GASの実行回数制限](https://developers.google.com/apps-script/guides/services/quotas)がありなるべく温存しておいた方が良い。
2. GASプログラムの行数が多くなり少し複雑になる。
3. UrlFetchAppの実行時間分だけオーバーヘッドが発生しスクリプト実行時間制限を逼迫する（6分なので、あまり圧迫しませんが）

#メリット

1. 自分の好きな間隔（最短5分間隔）でIFTTTを起動させられる。

#注意点

1. 恐らくフリープランでは`Polling Applets usually run within 1 hour`と書かれていてProプランでは`Polling Applets usually run within 5 minutes`と書かれているのでフリープランだとDate & Timeを使った場合よりも時間が掛かってしまうのではないかと思われます。
2. 前述の通り、GASには[トリガーの数やスクリプト実行時間、UrlFetchAppの実行回数など細かな機能に制限が掛けられている](https://developers.google.com/apps-script/guides/services/quotas)ので、それらに抵触しないように注意しましょう。
2. あまり連投するとIFTTTのサーバーに負担が掛かるのでおもいやりや良識のある用量を心がけましょう（Date & Timeウィジェットが持っている最短周期`15分`が公式的な定期実行の閾値なのかもしれませんが、一方でSpreadsheetのアップデートをトリガーに指定出来る事から、それ相応の頻度での呼び出しにも対応出来ることを前提にしているとも言えます）