QR コードと IFTTT と Google スプレッドシートで在庫管理・買い物リスト管理③IFTTT の Google スプレッドシートの設定

スマートホーム

前回の続きです。
多分、全部で4回くらいになると思ううちの、3回目です。

QR コードと IFTTT と Google スプレッドシートで在庫管理・買い物リスト管理①大まかな流れと IFTTT の設定(大枠)
2024年7月ころ、Alexa と Todoist の連携が使用不可になってしまいました。これは本当に悲しかったです。Todoist で ToDo リスト管理をしていましたし、Alexa の『買い物リスト』と Todoist の買い物リスト...
QR コードと IFTTT と Google スプレッドシートで在庫管理・買い物リスト管理②IFTTT の Webhook を設定
前回の続きです。多分、全部で4回か5回くらいになると思ううちの、2回目です。ただし、大したことはしてないし、私以外の人の参考にもならないと思います…。前回までで IFTTT での設定をしました。で、キモとなる Webhook についてです。...

前々回、IFTTT の Google スプレッドシートの設定をサラッと書きました。
特に『Formatted row』のところ。
ここについて、今回は解説を書きたいと思います。

=DATEVALUE(SUBSTITUTE(GOOGLETRANSLATE(LEFT("{{OccurredAt}}",FIND(" at ","{{OccurredAt}}")),"en","ja")," ",""))+TIMEVALUE(RIGHT("{{OccurredAt}}",LEN("{{OccurredAt}}")-FIND(" at ","{{OccurredAt}}")-3)) ||| {{Value1}} ||| =SUBSTITUTE(INDIRECT(“RC[-1]”,FALSE),"�", "") |||=IF(COUNTIF(INDIRECT("R1C[-1]:R[-1]C[-1]",FALSE),INDIRECT("RC[-1]",FALSE)),INDIRECT("RC[-3]",FALSE)-MAXIFS(INDIRECT("R1C[-3]:R[-1]C[-3]",FALSE),INDIRECT("R1C[-1]:R[-1]C[-1]",FALSE),INDIRECT("RC[-1]",FALSE)),"")|||

IFTTT でトリガーを発動したあと、特定の Google スプレッドシートの最初のシートの一番下に、このルールで行を追加する、というものです。
まず、『|||』というのがスプレッドシートのセルの区切りになっています。
まー、『\t(タブ)』ってことですかね。
なので、『|||』を区切り文字として分けると、上の数式には4つのパートがあることがわかります。

1つ目は、日付の処理部分。

=DATEVALUE(SUBSTITUTE(GOOGLETRANSLATE(LEFT("{{OccurredAt}}",FIND(" at ","{{OccurredAt}}")),"en","ja")," ",""))+TIMEVALUE(RIGHT("{{OccurredAt}}",LEN("{{OccurredAt}}")-FIND(" at ","{{OccurredAt}}")-3))

2つ目は、Webhook で渡す商品名の部分。

{{Value1}}

3つ目は、2つ目の商品名の文字列を置換する部分。

=SUBSTITUTE(INDIRECT("RC[-1]",FALSE),"�", "") 

4つ目は、同じ商品を前回入力してから今回までどれくらい間が空いたかを表示する部分。

=IF(COUNTIF(INDIRECT("R1C[-1]:R[-1]C[-1]",FALSE),INDIRECT("RC[-1]",FALSE)),INDIRECT("RC[-3]",FALSE)-MAXIFS(INDIRECT("R1C[-3]:R[-1]C[-3]",FALSE),INDIRECT("R1C[-1]:R[-1]C[-1]",FALSE),INDIRECT("RC[-1]",FALSE)),"")

こんな構成です。
まず1つ目ですが、これについては以前記事を書きました。

【IFTTT と Google スプレッドシート】日付({{OccurredAt}})を時間データとして使う方法
結論を先に書きますと…IFTTT の『THEN THAT』の Google スプレッドシート画面、『|||』をセルの区切りとして使用して記述するテキストボックス欄に、『{{OccurredAt}}』の代替として=DATEVALUE(SUBS...

去年の8月ですね。
ちょうど、このしくみをやってみたくていろいろ考えたり調べたりしていた頃でした。

1つ目(再掲、以前書いた記事とも同じものです)

=DATEVALUE(SUBSTITUTE(GOOGLETRANSLATE(LEFT("{{OccurredAt}}",FIND(" at ","{{OccurredAt}}")),"en","ja")," ",""))+TIMEVALUE(RIGHT("{{OccurredAt}}",LEN("{{OccurredAt}}")-FIND(" at ","{{OccurredAt}}")-3))

IFTTT では、その Webhook を発動した日時の情報をスプレッドシートに書き込むことができます。
『{{OccurredAt}}』と書き込むと日付が表示されるようになっているんですが、その書式が『March 19, 2025 at 07:00PM』みたいな変な書式なんです。
このままではスプレッドシートでは『日付』の情報として扱ってくれないのでとっても厄介。
なので、その『{{OccurredAt}}』の文字列をいろいろこねこねしたのが上です。
以前ネットで調べたものは、ここ数年で IFTTT の仕様が変わったのか使えないものが多かったので、なんとかまとめました。
詳しい解説は以前の記事に書いたので、そちらをご確認ください。

2つ目(再掲)

{{Value1}}

これは、Webhook で渡す文字列を表示させる部分です。
前回、Webhook の後ろに『?value1=◯◯』と付けて渡した文字列(商品名)がここに入ります。

3つ目(再掲)

=SUBSTITUTE(INDIRECT("RC[-1]",FALSE),"�", "") 

ここはね…、なぜだかわからんのですが、Webhook で渡した商品名の文字列の最後に『�』がつくんですよね…。
まー、エンコードの問題だと思うんですが、対応もめんどくさいです。
というか、私レベルではなんともできないっす。
べつに、最後につくだけで他の文字が文字化けするわけではないので、放って置くか1文字取り除くかかな、と思って、1文字取り除く方を選択しました。
たまに『しょうゆ�』みたいな文字列を渡されるので、この数式で『�』を取って『しょうゆ』にシているというわけです。
『SUBSTITUTE』関数は、文字列にある特定の文字を別の文字に置き換える関数です。
わざわざ『INDIRECT』関数を入れているのは、そうすることでセルの指定ができるからです。

【IFTTT と Google スプレッドシート】INDIRECT 関数を使えば R1C1 形式が書ける!
結論を先に書きますと…Google スプレッドシートでも『INDIRECT関数』を使えば『R1C1形式』で数式を書くことができます。IFTTT で Google スプレッドシートに行を追加するアプレットでも使えるので、『|||』をセルの区切...

↑こちらで以前書きました。

4つ目(再掲)

=IF(COUNTIF(INDIRECT("R1C[-1]:R[-1]C[-1]",FALSE),INDIRECT("RC[-1]",FALSE)),INDIRECT("RC[-3]",FALSE)-MAXIFS(INDIRECT("R1C[-3]:R[-1]C[-3]",FALSE),INDIRECT("R1C[-1]:R[-1]C[-1]",FALSE),INDIRECT("RC[-1]",FALSE)),"")

こちらの数式については、上の『INDIRECT』関数の記事でみっちり書いています。
いやー、Google スプレッドシートも『INDIRECT』関数を使えば『R1C1形式』で数式が書ける、ということに気づけてよかったです…。

こうやって Google スプレッドシートに『タイムスタンプ』と『商品名』を渡すことができれば、あとはスプレッドシートの方でこねこねして好き勝手にすればいいですね!

次で最終回にできるかな。
次回はその他の IFTTT の設定と実際に使っているモノを紹介させてください。

コメント

タイトルとURLをコピーしました