![見出し画像](https://assets.st-note.com/production/uploads/images/77625588/rectangle_large_type_2_44bd41366695eb13f609ab8eb15eceed.png?width=1200)
Keyboard Maestroでの「配列」(Array)の扱いについて(続編)
Array(配列)に関するこちらの記事の続編です。
インデックス番号から取り出すのはなく、文字列からインデックス番号を割り出す方法について考えてみます。
何がしたいの?
「AからGまで」の文字列を出力できるようにします。
![](https://assets.st-note.com/img/1651432558507-HiD9XyfZPT.png?width=1200)
「Aから10個」に対応したり、「CからF」などを取り出せるように。
![](https://assets.st-note.com/img/1651437816810-Db0S8cFPsc.png?width=1200)
検索文字列のみを変数として扱う
そもそも論としてKeyboard MaestroのArray(配列)の機能は最低限のものしかありません。そのため、JavaScriptの力を借ります。
「新宿、渋谷、池袋」の文字列から「渋谷」が何番目にあたるかを調べてみます。
![](https://assets.st-note.com/img/1651431339886-11cDmdcn6W.png?width=1200)
検索したい文字列を変数「ArrayText」で設定します。
「Execute JavaScript For Automation」アクションで次のように記述し、Keyboard Maestroの変数(以下「KM変数」)をJavaScriptで扱えるように読み込みます。
const kmeApp = Application('Keyboard Maestro Engine') ;
const str = kmeApp.getvariable('ArrayText') ;
「Execute JavaScript For Automation」アクション内で、次のように配列を宣言します。
const city = ['新宿', '渋谷', '池袋'];
「Execute JavaScript For Automation」アクション内で、次のように配列を記述し、strがcity内で何番目にあたるかを調べます。
city.indexOf(str);
JavaScriptの配列は0スタートなので、戻り値は「1」です。そこで「Set Variable To Calculation」アクションを使って1を加算します。
![](https://assets.st-note.com/img/1651431286766-ffVQ6wp3Lz.png?width=1200)
その結果「2」が戻ります。
![](https://assets.st-note.com/img/1651431360485-Wx1c1tHPhp.png?width=1200)
配列の元となる文字列を変数として扱う
「新宿、渋谷、池袋、品川、世田谷」というKM変数をJavaScriptでの配列として扱います。
![](https://assets.st-note.com/img/1651431615919-9qxzFEKKFt.png?width=1200)
変数「ArrayText」で配列として扱いたい文字列を宣言します。
![](https://assets.st-note.com/img/1651431670104-4kHL0ESXmF.png?width=1200)
これを次のように、JavaScriptで配列として扱えるようにします。
['新宿', '渋谷', '池袋', '品川', '世田谷']
まず、「Execute JavaScript For Automation」アクション内で変数「ArrayText」を読み込み、splitを使って分割します。
今回は元の文字列が「、」がつながっていますので、splitの引数に「、」を設定します。これだけでJavaScriptで配列として扱えるようになります。
const kmeApp = Application('Keyboard Maestro Engine') ;
const ArrayText = kmeApp.getvariable('ArrayText');
array = ArrayText.split('、');
JavaScriptで配列化する際の区切り文字を変数化する
今回は「新宿、渋谷、池袋、品川、世田谷」ですが、「新宿, 渋谷, 池袋, 品川, 世田谷」になっていることもあるでしょう。
そこで、区切り文字を変数化してみます。
![](https://assets.st-note.com/img/1651432029692-VuVhtbTSob.png?width=1200)
変数化していない場合には' 'で囲む必要がありますが、
array = ArrayText.split('、');
「変数」化している場合には' 'は不要です。
array = ArrayText.split(divider);
ABC版
AからZの文字列に変更してみます。
![](https://assets.st-note.com/img/1651432301498-PgJfU3dsny.png?width=1200)
マクロを実行すると「7」が戻ります。
![](https://assets.st-note.com/img/1651432333699-zwcwJB3jkc.png?width=1200)
「Aから指定した文字まで」
indexofで算出した数字までをFor eachで回します。
![](https://assets.st-note.com/img/1651433131308-137Z5fiauQ.png?width=1200)
「Aから何個」
indexofからいったん離れて「何個」は簡単です。
![](https://assets.st-note.com/img/1651433443652-R2O4CGUub3.png?width=1200)
![](https://assets.st-note.com/img/1651433461606-x8lre8l2mr.png?width=1200)
まとめ
「どの文字からどの文字まで」「どの文字から何個」を指定して生成します。
![](https://assets.st-note.com/img/1651438440859-ytuGxx4Pgu.png?width=1200)
![](https://assets.st-note.com/img/1651438431313-8H4qQEYOsi.png?width=1200)
ダウンロード
サンプルマクロを置いておきますので、試してみてください!
定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5