
少し前のアップデートで追加されたアクションです.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS26.4
スポンサーリンク
Actionsのアクション「Counter」

「Counter」アクションはローカルで扱う非負整数を保持・増減できる簡易カウンターです.

あらかじめ
- Increment(加算、デフォルト)
- Decrement(減算)
- Get
- Set
から選び、カウンターの名前に相当するKeyと代入する値であるValueを指定します.
過去に追加されたGlobal Variableのように扱えるのに対し、iCLoud同期をしないため各端末で完結する特徴があります.
Global Varibleと比べて追加制限はないですが、数以外のテキストや構造化データは扱えず、デフォルト値は0、0を下回る処理は0を返します.
0以上の整数だけ扱えるということですね.
グローバル変数ほどでないけどグローバル変数っぽく使えるのでシンプルな用途に向いています.

このアクションの便利なところは、変数定義を兼ねているためアクション数を減らせる点です.
Counter自身もSetを使えるわけですが、画像のようにIncrementにして希望の数を指定することで、変数定義と初期化を兼ねることが可能です.
通常なら数字アクションに対してマジック変数か「変数を設定」、Gobal VaribleでもSet Numerが必要ですがCounterアクションはその1アクションの手間が不要です.
Counterのクリア

これらのcounterは基本的には作ったらそれっきりです.
作れば作るほどたまっていきます.
そのcounterを削除するために「Counter - Clear All」というアクションが用意されているのですが、名前の通りこれまでに作ったcounterすべてが削除されてしまいます.
そのため説明でも特定のKeyを削除したい場合は0で上書きすることで削除の代わりとするよう書かれています.
カウンターレシピで比較
アクション名からわかるようにCounterアクションは数を加減するのに役立ちます.
過去にもカウンターレシピを紹介しましたが改めてここで紹介することでCounterを使う場合との違いを感じてもらいます.
なお、Counterアクションとの比較をするため、以下の仕様で作ります:
- 選択肢は「クリア」「+1」「-1」の3項目
- 負数になる処理は0のままにする
- 「メニューから選択」のプロンプトにその時点での値を表示
- レシピ自身を「ショートカットを実行」でループさせる
補助アプリを一切使わない場合

まずはActionsなどを一切使わない方法です.
この場合は過去にも紹介した「ショートカットの入力」をうまく使います.
今回はカウンターとなる数をショートカットの入出力として渡すことになりますが、ループ一度目の「ショートカットの入力」は空なので、if文で場合分けしてショートカットの値がない場合は数字の0を指定しておきます(今回はこれをvという変数をカウンタ変数として置いています).
これで二度目はvに0が入っているので空ではありませんね.

イニシャルが済んだのでif文の「その他の場合」に移ります.
この場合はvが空でない(初期値の0)なのでメイン処理となります.
「メニューから選択」で「クリア」「+1」「-1」の3項目を用意します.

クリアの場合は今回なら0を上書き、+1の場合は変数vに1を足せばいいですね.

-1の場合はif文を使い、変数vが0でない場合だけ1で引きます.

「メニューから選択」から抜け、そのマジック変数である「メニューの結果」で変数vを上書きします.
最後に「ショートカットを実行」でこのレシピ自身を呼び出し、入力として変数vを指定しておきます.

これで実行して選択するたびに1が加算or減算されたり、クリアされて0になる超シンプルならカウンターが完成です.
ただしこのレシピではカウントした数を外部に格納していないため、レシピを終了すると情報は消えてしまいます.
Actionsのグローバル変数を使う場合
次はActionsにあるGlobal Variableを使います.

先に少し触れた通り、Global Variableも変数定義は省略できます.
なので未定義のまま上の「Global Variable: Set Number」を使えなくもないのですが、値が空の状態だと実行時に値の入力を求められます.
なのでその場でいいので一度変数定義だけしておくといいです.
ここでは「Global Variable: Set Number」で初期値0のtestというグローバル変数を定義したことにして先へ進みます.

「メニューから選択」のプロンプトに現在の値を表示させたいので、最初に「Global Varibles: Get Numer」でグローバル変数testの値を取得し、「メニューから選択」を追加して先ほどと同じように3項目入れておきます.

「Global Variable: Set Number」はSetと名が付いてますがIncrementとDecrementに切り替えることができます.
これを利用してクリアならば0にSet、+1なら1でIncrement、-1なら最初に取得したグローバル変数testが0でない場合だけ1をdecrementします.

「メニューから選択」を抜けます.
Global Variableのアクションは上書きを兼ねているため、「変数を設定」は不要です.
そのためループさせるための「ショートカットを実行」の入力も無視して構いません.
先ほどと比べて「変数を設定」以外はアクションが入れ変わっただけに見えますが、Global Variableが外部でデータを管理しているため、一端レシピを終了して再び実行した場合は前回最後に実行したときの値から始まります.
Counterを使う場合

そして次は今回紹介したCounterを使う場合です.
最初に紹介した通りCounterは変数(Key)の定義・宣言は不要ですが「メニューから選択」のプロンプトに必要なのでGetにしておいたCounterで指定のKey(今回はtest)の値を取り出し、「メニューから選択」のプロンプトに使います.
「メニューから選択」の項目は先ほどと同じように追加します.

選択した項目が「クリア」と「+1」の場合はグローバル変数のときとそっくりですが、-1の場合はCounterの仕様に従い1でDecrementするだけです.

「メニューから選択」から抜け、このレシピ自身を実行すれば完了です.
先程のグローバル変数の性質と同じくCounterもアクション内部で上書きされているため「メニューの結果」で上書きする必要もなければ「ショートカットを実行」の入力を気にする必要もありません.
このように、ショートカット単体とActionsのグローバル変数、Counter…と使用するアクションを変えるたびに全体のアクション数が減っているのがわかります.
全体のアクション数が少ないうちはわかりませんが、アクション数が増えると露骨に処理速度が遅くなるショートカットにおいてアクション数の節約はとても貴重です.
応用:Counterをキャッシュとして使う
最初に書いた通りCounterはiCloud同期の対象外であり、クリアするのも個別に0で上書きするか全削除の2択しかありません.
中長期的に使って不要になるcounterと破棄してよいcounterが溜まっていくのは目に見えています、かといってそんな頃に全削除はリスクが大きいのは言うまでもありません.
そこでCounterをキャッシュとみなし、同じActionsにあるGlobal Variableを永続層(退避先)とし、気兼ねなくCounterの全削除を使える仕組みを考えてみます.

まずは何らかのレシピでCounterを使う状況を考えます.
ここでは全体は無視してcounterが操作された事実だけ確認しておきます(今回はaというKeyを定義し1が代入された状態です).
準備

次にキャッシュとなるグローバル変数のデータを定義・初期化します.
色々やりようはあるでしょうが、今回はキャッシュしたいデータがキーと値で構成されているのでjsonにするのが良さそうと判断しました.
キャッシュするたびに新しいグローバル変数を作るのは効率が悪いですからね.
キャッシュした際の日付をキーとして、その下に入れ子としてキャッシュすれば、削除したい際に日付を指定して処理することもできますね、ここでは紹介しませんが.
ただGlobal Varibleは空の状態では定義できないため、画像のように適当なキーと値の組を1つ入れた状態で「Global Varible: Set Text」でわかりやすくcacheという名前で定義しておきます.
一度実行したらこのレシピは破棄して構いません.
CounterをGlobal Varibleにキャッシュ

グローバル変数cacheを作ったので実際にCounterの特定のKeyを同名のGlobal Variableとしてセット(退避)するレシピを作ります.
まずCounterアクションで特定のKey(今回はa)の値をGetで取得します.
続けてGlobal Variable: Get Textでグローバル変数cacheを取得します.
「辞書の値を取得」でグローバル変数cache(のjson)に対してキーaとその値を設定します.
これで取得時のcacheにキャッシュしたいデータのキーと値が追加されたjsonが出来たので、Global Varible: Set Textで上書きします.
暗くしてある最後のアクション(Global Varible: Get Text)は処理結果を見るために追加しただけなので、実際のレシピでは不要です.
これでCounterの特定のKeyとその値をGlobal Varibleにキャッシュすることができます.
画像は特定のひとつだけをキャッシュするレシピですが、複数のデータをキャッシュしたい場合はもう少し工夫することが必要になってきます.
「リスト」で特定のKeyを定期的にキャッシュするようにするか、「入力を要求」で希望のKeyを改行付きで入力させ、それを分割して「各項目を繰り返す」で処理させるか…という感じになるでしょうね.
せっかくなのでこのレシピは手実行でなく時間などでオートメーションを組んで自動で行わせるのもいいですね.
キャッシュから復元

次はキャッシュ先である「Global Variable」からCounterに復元するレシピです.
今回も特定のKey(今回はa)を対象とします.
まずGlobal Variable: Get Textでcacheを取得します.
「辞書の値を取得」で指定のキーの値を取得します.
「Counter」で指定のキーに対して上で得た値をSetします.
これで希望のCounterにGlobal Variableの同名キーの値が代入される、つまり復元されることになります.
キャッシュの削除(特定のキーの場合)

最後にキャッシュを削除するレシピです.
まずは特定のキー(今回はa)だけを削除するレシピです.
「Global Variable: Get Text」でcacheの値を取り出します.
このjsonに対して、Counterと同じタイミングで追加されたアクション「Remove Dictionary Values」を使います.
Keyには(今回の場合)aを、Dictionaryには最初に取得したcacheの値(であるjson)を指定します、これでcache内のキーaとその値が削除されます.
キャッシュの削除(全削除)

最後はキャッシュを全削除する場合です.
「Remove Dictionary Values」を使ってもいいんですが、どのくらいキーがあるか分からない状況でいちいち全部のキーを取得してキーごとに削除…なんてことはやってられないので、全削除状態のjsonを上書きすることでサクッと全削除扱いにします.
「テキスト」アクションに全削除状態のjsonを書き、「Global Variable: Get Text」でcacheを呼び出し、「Global Variable: Set Text」で最初のテキストで上書きします.
最後のアクションは先程同様確認用に追加しただけなのでレシピの目的とは無関係です.
「Counter - Clear All」を使う際はこれらを適切に使った後にしましょう.
〆
普通に演算用として使うのもいいですし、応用として書いたキャッシュもどきのような変わり種で使うのもアリだと思います.

