IFTTTを使うとGoogleSpreadsheetへ2000行までしか書けない問題

IFTTT の『Add row to spreadsheet』を使っている時、行数が2,000に達した時点で既存ファイルへの記録が停止し、連番なファイルに切り替えられてしまいます。

これは仕様のようなので、、、回避策を探してみました。

案1:Zapierを使う

curl -v -H "Accept: application/json" \
        -H "Content-Type: application/json" \
        -X POST \
        -d '{"Time":"YYYY/MM/DD hh:mm:ss","Temp":"24.5","Hum":"70.8","Pressure":"1005.1","TVOC":"200","eCO2":"100"}' \
        https://hooks.zapier.com/hooks/catch/[MyZapierId]/[CatchId]/

みたいな感じで(パラメータもIFTTTの3個を越えた値を渡せるし)2,000行を越えても大丈夫みたいなのですが、いざ本番環境に実装しようとして、(一ヶ月あたり50回未満程度しかキックしないなら、フリーで行けますが)かなりお高くなることに気づき、ボツとなりました。

案2:IFTTTで頑張る

ぐぐってみると『書き出し先が2,000行を越えないように管理する/IFTTTで書き込みが発生したタイミングで、IFTTTから書き込まれたデータを別ファイルに転記する』方法が出て来ます。

https://github.com/covrig/homeassistant-trackermap

とか

https://community.weatherflow.com/t/google-sheets-ifttt-and-the-2000-row-limit-a-query-edit-and-solution/11161

とか。
※上記weatherflowさんのコードをコピペする場合は、シングルクォーテーション(例:’Sheet1’)となるべき部分が引用符(例:‘Sheet1’)になっているので注意ください。

という訳で、実装してみます。

  1. IFTTTから書き出すスプレッドシート『Source』とIFTTTの連携(アプレット名は『当該アプレット』とします)は完了しているものとします
  2. 『Source – Google スプレッドシート』のURL欄が、
    https://docs.google.com/spreadsheets/d/HISASHINIHINANANIHACHI/edit?pli=1#gid=0
    のようになっているので、この『HISASHINIHINANANIHACHI』を記録しておきます
  3. データを保存したいファイルを『Archive』とします(保存先にGoogleSheetsを新規作成、画面左上の『無題のスプレッドシート』の所を『Archive』に変更します)
  4. 『Archive – Google スプレッドシート』のURL欄が、
    https://docs.google.com/spreadsheets/d/JYUGEMUJYUGEMUGOKOUNOSURIKIRE/edit?pli=1#gid=0
    のようになっているので、この『JYUGEMUJYUGEMUGOKOUNOSURIKIRE』を記録しておきます
  5. 『Source – Google スプレッドシート』→『拡張機能』→『Apps Script』の順にクリックし、プロジェクトエディタを起動します

  6. 画面上部のプロジェクトタイトル『無題のプロジェクト』を『Archive』と変更します

  7. コード欄の
    function myFunction() {
       
    }
    

    に、次のコード

    function onChange(event) {
      var source = SpreadsheetApp.openById('コピー元のGoogleスプレッドシートのID');
      var archive = SpreadsheetApp.openById('アーカイブ先のGoogleスプレッドシートのID');
      var sourceSheet = source.getSheetByName('シート1');
      var destSheet = archive.getSheetByName('シート1');
      var sourceData = sourceSheet.getRange('切り出しセル範囲').getValues();
      destSheet.getRange(destSheet.getLastRow()+1,1,sourceData.length,sourceData[0].length).setValues(sourceData);
      sourceSheet.getRange('切り出しセル範囲').clear({contentsOnly: true});
    }

    を『上書き』します

     

  8. 上記コードの『コピー元のGoogleスプレッドシートのID』欄に、『Source』のID、『HISASHINIHINANANIHACHI(庇に雛…ではなく、Sourceの実ID)』を入れます
  9. 上記コードの『アーカイブ先のGoogleスプレッドシートのID』欄に、『Archive』のID、『JYUGEMUJYUGEMUGOKOUNOSURIKIRE(寿限無…ではなく、Archiveの実ID)』を入れます
  10. 上記コードの『シート1』には実際のシート名を入れます
  11. 上記コードの『切り出しセル範囲』には、『Source』から『Archive』に持って行きたい範囲を指定します
    『Source』が

    のようになっているなら、範囲を『A1:F2000』、
    『Source』は(自分ではもう触らないので)

    のようにしているなら、範囲を『A2:F2000』とします
    ※切り出し範囲の終端行は、2,000でなくても大丈夫だとは思います。IFTTTから『Source』に一度に書き込まれる量や、何らかの要因でGoogleAppsScriptが詰まって処理が間に合わない場合等の可能性を勘案しながら適当に調整下さい(最小、1行分?)
  12. 最終的なコードは次のようになります
  13. コード欄1行目の『function』の上にあるセーブボタン(3.5インチフロッピーディスクのマーク)をクリックします
    今はフロッピーディスクを知らない人も多いのかな…
  14. スプレッドシート『Source』とスプレッドシート『Archive』の不要な列は削除します
    ※行数制限の他に、総セル数制限もあったりなかったりするので、念の為、不要な列は削除した方が良いかと
  15. 『Source』が2,000行に達しておらず、『Source(1)』等が作成されていなかった場合は、ステップ⑳に進みます
  16. スプレッドシート『Archive』に、スプレッドシート『Source』,『Source(1)』,…の内容を貼り込んで行きます
  17. スプレッドシート『Source』から、スプレッドシート『Archive』へコピペ済みの行を削除します
    ※これにより、IFTTTによって新しく追記された分のみを処理対象とすることができます
  18. IFTTTの管理画面に行き、『My Applets』→『当該アプレット』→『Settings』→『Then』→『Spreadsheet name』欄の“Source”を一旦クリアし、再度“Source”を記入→『Update action』をクリックします
    ※私の場合は、このステップを飛ばすと『Source』がIFTTTによりアップデートされなかった感じです

  19. 『Update』をクリックし、アプレットをアップデートします
  20. 『Archive – プロジェクト編集者』タブに戻り、左側ペインの目覚まし時計のアイコンをクリックします
  21. 右下の『トリガーの追加』をクリックします
  22. イベントの種類を『変更時』にし、『保存』をクリックします
  23. 『Choose an account』画面になるので、自分のGoogleアカウントをクリックします
  24. 『Google hasn’t verified this app』な画面になるので、問題無ければ左下の『Advanced』をクリックします
  25. 再度『Google hasn’t verified this app』な画面になるので、問題無ければ左下の『Go to Archive (unsafe)』をクリックします
  26. 『Archive wants to access your Google Account』な画面になるので、問題無ければ左下の『Allow』をクリックします
  27. トリガーが無事登録されるとこのようになります
  28. ここまでで問題がなければ、IFTTTが『Source』にデータを書き込んだ数秒後に、『Source』から『Archive』にデータが転記されるようになります

以上です。


おまけ:不要になったプロジェクトを削除する方法

  1. 『Archive – プロジェクト編集者』タブ内で左上の『Apps Script』をクリックします
     
  2. 自分のプロジェクト一覧になるので、消したいプロジェクトをハイライトさせ、右側の『︙』をクリックします
  3. メニューが開くので、『完全に削除』をクリックします
  4. 確認画面が出るので、問題無ければ『完全に削除』をクリックします

以上です。