近頃生成AIとの距離が縮まってきた私(@saosaoyamayama)です。
その大きな要因はsattoが使えるようになったこと! そしてsattoを使いこなすために、新しい「へぇ〜!」を拾い集めていること。人間、いくつになっても勉強ですな。
今回はsattoではなく(はい?)、生成AIでもなく、MacのショートカットアプリとGoogleスプレッドシートのAPI連携のお話です。
実はショートカットアプリを使って、めちゃカンタンにAPI連携できるって最近知ったんですよね……。
かなり需要は低いと思いますが、スクリプトに苦手意識をお持ちの方のお役に立つかもしれません。
※本記事はPRを含みます。
Contents
GASナシでスプレッドシートのデータを取得する準備と注意
「スプレッドシートのデータなんて、GASでいくらでも引き出せるでショ」
そうですね、確かに。ただ、GAS慣れ(スクリプト慣れ)していない層にとって、謎の文字列によるデータ操作って怖いものなんです。
うまくいかなかった時、どこをどういじればいいの? とか。ChatGPTにどう質問すればいいの? とか。
今回は、データ取得までの流れの中でスクリプトを一切書きません。
では材料から見ていきましょう。3分クッキングのBGMを流してください。
- Google SheetsのAPIキー
- データを格納したスプレッドシート
- ショートカットアプリ
Google Sheets APIのキーを取得する
APIキーとは、ショートカットアプリがスプレッドシートの家に入る時に使う合鍵です。
このカギは、シートではなくスプレッドシートアプリという家に紐付いているので、部屋(シート)が増えても同じカギが使えます。もちろん用途によって別のカギを作ることもできます。
以下は途中端折りますが、スプレッドシートのAPIキーを取得する流れです。
まず、Google Cloudにアクセスし、右上の「コンソール」を押します。
クイックアクセスの中の「APIとサービス」をクリック。
ご自身が持っているGoogle API関連の情報が表示されます。左サイドバーから「ライブラリ」をクリック。
「Google Sheets API」を探しましょう。
パッと見てなければ「Google Workspace」という項目の中にあります。
この後のキャプチャがないんですが……有効にしますか? と聞かれたら有効にしてください(雑)。
続いてサイドバーから「認証情報」を開きましょう。
キャプに写っていませんが、「認証情報を作成」→「APIキー」でキーが作成できます。
キーはどこかにメモしておいてもいいですし、コンソールからいつでも確認可能です。
APIキーでできること
先ほどの手順で取得したAPIキーは、シートの「読み取り」にしか使えません。今回はこれで事足ります。
もしシートを編集したければ、OAuth2.0認証をするか、サービスアカウントを使いましょう。
どちらの方法についてもわかりやすい手順があちこちの記事に書いてあるので、確認してみてくださいな。そんなに難しくない……はず。
セキュリティリスクを知っておこう
OAuth2.0認証をクリアすると、シートの共有範囲を「制限付き」にした状態でAPIが使えます。
サービスアカウントは、アカウント設定時に発行されるメールアドレスに権限を付与すれば「制限付き」でAPIが使えます。上の画像はサービスアカウント「gserviceaccount」に編集権限を渡した状態です。
一方、今回のようにAPIキー単独で使う場合、共有設定を「リンクを知っている全員が閲覧可能」にする必要があるんです。この状態でURLが流出すると、誰でもアクセスできてしまいます。
そのため、今回のAPI操作では、万が一外部に漏れても差し支えないデータ・シートを使ってください。たとえば仕事の情報や個人情報の操作には適していません。
スプレッドシートのデータを取得するショートカット
過去イチ短いショートカットです。
※タイトルに「スプレッドシートのリスト化」とありますが、あまりに気にしないでください。
私はシートキーやデータ範囲を変更しながら使うことを想定しているので、テキストアクションを4つセットしています。
しかし、変更する予定がなければ「URLの内容を取得」のURLに直書きしちゃってOKです。そうすると。アクション1つでデータが取れてしまいます。
①のスプレッドシートキーは、スプレッドシートのURLから抜き出します。
https://docs.google.com/spreadsheets/d/1XXXXXXXXXXXXXXXXXXXXXs/edit
赤い文字の部分がスプレッドシートのキーです。これをテキストアクションにコピペしましょう。
②はデータを格納しているタブの名前ですね。③は取得したいデータの範囲です。
④には先ほど取得したAPIキーを入力してください。
続いて、「URLの内容を取得」アクションを挿入します。
https://sheets.googleapis.com/v4/spreadsheets/1XXXXXXXXXXXXXXXXXXXXXs/values/test!A2:C10?key=Ahogehogehoge0
こんなURLになるように、テキスト変数を設置すれば完了!
念のため「URLの内容を取得」の右にある「表示を増やす」をクリックし、プルダウンが「GET」になっていることを確認しましょう。
そして忘れちゃいけないのが、スプレッドシートの共有権限の変更です。「リンクを知っている全員が閲覧可能 or 編集可能」にしてくださいね〜!
ショートカットを動かしてみる
今回扱うデータはこんな感じ。
Eagleという画像管理アプリのキャプチャからOCRでファイル名を取得し、画像説明とタグを考える、というのをsattoにやってもらったデータです。
A〜C列にデータが並んでいます。
ショートカットを動かすと、出力エリアにデータが出力されます。
画像では「〜から〜を取得」という別のアクションを挟んでいますが、出力結果は同じです。
スプレッドシートから取得したデータはJSON形式と呼ばれる構造になっています。わかりやすく表現すると、入れ子を使った「リスト」みたいなものですね。
{
"range": "test!A2:C10",
"majorDimension": "ROWS",
"values": [
[
"pixta_40058810_M.jpg",
"青い空を指差す子供",
"子供,屋外,指差す"
],
[
"pixta_411329785_M.jpg",
"公園で手を繋いで走る親子",
"親子,公園,手を繋ぐ"
]
]
}
- range:test!A2:C10
- majorDimension:RAWS
- values:
- _
- pixta_40058810_M
- 青い空を指さす子供
- 子供,屋外,指差す
- _
- pixta_411329785_M
- 公園で手を繋いで走る親子
- 親子,公園,手を繋ぐ
- _
データを整えるとこんな感じ。{}や[]で階層が変わるリスト構造です。無理矢理リスト化してみると、最終的に2つの3連データが格納されていることがわかります。
このデータをどのようにして扱うか、が問題ですね……。
ショートカットアプリでスプレッドシートJSONを捌く方法(ざっくり)
ショートカットで取得したスプシJSONの処理方法は、大きく3つあります。
- ショートカットアプリのリスト・辞書として扱う
- スクリプトに処理させる
- テキストとして扱う
ショートカットアプリのリスト・辞書として扱う
3連データを3連のまま扱いたい、ショートカットアプリの中で処理を完結させたい、とするならショートカットの「リスト」や「辞書」の概念を理解する必要があります。
Apple公式サイトにはAPI連携で取得したJSONデータをショートカットの中でどのように扱えばいいか、結構詳しく書いてあります。ただし、スプレッドシートで取得できるJSONと、説明の中に書いてあるJSONは構造が異なります。
以下はAppleの説明に合わせて書き換えたJSONです。
{"name":"pixta_40058810_M.jpg","annotation":""青い空を指差す子供","tags":"子供,屋外,指差す"},{"name":"pixta_411329785_M.jpg","annotation":"公園で手を繋いで走る親子","tags":"親子,公園,手を繋ぐ"}
まず{}で囲まれている点、そして各値の前に「キー名」が付いている点で異なります。
ショートカットでは{}に囲まれたものを「辞書」と認識するようです。
上のJSONは{}が2セットあるので、辞書項目が2つある、とカウントします。しかしJSONが[]で囲まれていると、項目数が6つになっちゃうんです……。
そのため、Appleの解説を見ながらスプレッドシートのJSONを処理しようとするとうまくいきません。ショートカットで処理を完結させるなら、構造を無理矢理書き換える必要があります。
まぁ、面倒ですよ……。実際やってみたのでね……。どのようにやったかは、いつか記事にできるといいなと思っています。
スクリプトに処理させる
飛び道具的になりますが、ショートカットのアクションで無理に処理せず、「AppleScriptを実行」アクションで処理する方法があります。
私はスクリプトが書けませんので、ChatGPTに丸投げです。
ChatGPTはショートカットアプリについてある程度理解しているようで、「ショートカットアプリで取得したこういうデータを使って〜」と伝えれば、素晴らしいスクリプトを書いてくれます。
なお、やりようによってはPythonなど他の言語も使えるそうです。
実際にやったのは、スプシのデータをEagleに入力する、というスクリプト。うまく動きましたよ〜!
テキストとして扱う
JSONデータは、リスト関連のアクションに渡すことでリスト・辞書として機能し始めますが、渡さなければただの「テキスト」なんですよね。
そのため、テキストとして取り出して、一致・分割・置換などのアクションを駆使して欲しいデータだけ引っ張り出すのがカンタンかもしれません。
たとえば以下のデータなら、カッコ類とvaluesを消して「”,”」で分割することで、すべてのデータが切り離せます。
{"values":[["pixta_40058810_M.jpg","青い空を指差す子供","子供,屋外,指差す"],["pixta_411329785_M.jpg","公園で手を繋いで走る親子","親子,公園,手を繋ぐ"]]}
ショートカットアプリを使えばノーコードでAPI連携できる!
今回の「URLの内容を取得」は、当然ながらスプレッドシート以外のAPI連携にも使えます。
たとえば上の画像では、Chatworkに登録してあるタスクを引っ張っています。これをスプレッドシートに出力すれば、GASを使う必要がありません。
ショートカットアプリでは「タスクが追加されたらショートカットを実行する」という自動化はできませんが、カレンダーと連携して時間指定の実行が可能です。
毎日12時にショートカットを動かして「タスクは○件です」とポップアップを表示させる、なんて使い方はできます。しかも、コードは一切必要なし!
最近はsattoを使った自動化に勤しんでいる私。Chatwork連携もサクッとできました。でもsattoで何もかもできるわけではありません。たとえばローカルデータは扱えません。ショートカットは自分のパソコンに保存してあるデータがいじれるので、そこは優位性ありますよね〜。
いずれにせよ……以前はスクリプトを書くことが第一選択肢だったAPI連携が、ショートカットアプリ(Automatorも)のおかげでスクリプトや他サービスの利用なしで使えるようになりました。
「自動化なんて自分には無理」と諦めていた人も、ぜひチャレンジしてほしいなあと思っています。
ついにPythonにまで手を出した私ですが、うまく出力できた瞬間のあの気持ち、何なんでしょうね。思わずXに投稿したよね、うれしくて。