📊

GAS からAdmina API を使って SaaS 利用状況を可視化する Looker Studio を作ってみた

2024/02/04に公開

タイトルの通り、Admina API を使ってサービスxアカウントの一覧を取得する GAS のコードを OSS で公開しました。
https://github.com/howdy39/admina-services-visualization-gas

実際に使う際はこれをベースにご自身の環境に合わせてカスタマイズしてもらえばいいかなと思います。

最終的な成果物のイメージ

GAS

スプレッドシート

Looker Studio

これを作ると何が嬉しいの?

下記のようなケースで利用できますし、スプレッドシートに一度だしているので、スプレッドシートの内容を見てアカウント削除漏れがあったことを Slack でサービスごとの管理者に通知、みたいな拡張をするとよいでしょう。

メールアドレスで検索してサービス一覧を出す

退職ステータスで検索してアカウント削除漏れアカウント一覧を出す

Looker Studio(BI ツール)で閲覧できるのがメリット

Admina に従業員全員を招待してもいいっちゃいいのですが、BI ツールでまとめてみたいですし、Looker Studio であれば条件で絞った一覧をそのまま CSV やスプレッドシートに書き出したり、iframe でドキュメントツールに埋め込んだりみたいな活用ができます。

拡張して使うなら Admina の外の世界でやったほうがいいです。

GASのポイント

OSSにしているGASの部分だけ軽く解説しとこうかなと思います。

GASのテンプレートについて

GAS は筆者の自作テンプレートである gas-clasp-starter を使っています。
https://github.com/howdy39/gas-clasp-starter

24年2月時点では、GAS のローカル開発テンプレートは上記のテンプレートか Google 製の aside のどちらかがいいかと思います。(テンプレートは他にもたくさんありますが、メンテされてないため)
https://github.com/google/aside

がっつり本番環境と検証環境を分けて開発するなら aside で、そこまでじゃないなら gas-clasp-starter を使うとよいでしょう。

※ gas-clasp-starter は aside をベースに筆者が欲しい機能だけに削ぎ落として、ビルド部分を少しだけカスタマイズしたものです

(余談) gas-slacp-starter で作成するメリットを紹介

最終的に別ファイルで書かれたコードが index.gs ファイルにまとまるのですが、rollup でビルドしており、難読化もされていません。つまりきれいなコードで読みやすいです。

しかしこの 読みやすい はデメリットになりうるのです。

違う人だったりや未来の自分がそのままリポジトリ管理されているのに気づかずに GAS をいじってしまったりする可能性があります。また、どこのリポジトリのコードかがわからなくなってしまうのです。

そのため gas-clasp-starter ではビルドしたコードの冒頭にリポジトリのURLをコメントで出力して これはリポジトリで管理されたコードです。直接いじってはいけません。 を明示的にしています。

/**
 * Name: admina-services-visualization-gas
 * Version: 1.0.0
 * Description: Google Apps scripts that use the Admina API to export data to a spreadsheet for visualization of SaaS usage in Looker Studio and other applications.
 * @see https://github.com/howdy39/admina-services-visualization-gas
 */

const ADMINA_API_KEY = PropertiesService.getScriptProperties().getProperty('ADMINA_API_KEY');
class AdminaService {
    static listServices(organizationId) {
        const basedUrl = `https://api.itmc.i.moneyforward.com/api/v1/organizations/${organizationId}/services/`;
        const params = {
            method: 'get',
            headers: {
                Authorization: `Bearer ${ADMINA_API_KEY}`,
            },
        };
...
...

APIの叩き方

List organization services で サービスIDの一覧を取得してから List all SaaS accounts of a service でアカウント一覧を取っています。

取得項目を増やす場合

このあたりに追加して TypeScript で型エラーが出たところを直してけばいいかと思います。

https://github.com/howdy39/admina-services-visualization-gas/blob/main/src/AdminaService.ts#L80-L106

トリガー設定

最近はトリガー設定もコードに書くようにして IaC ぽくしています。
どのアカウントやどのファイルに設定したかなんかは README などに書いておくとよいかと思います。

https://github.com/howdy39/admina-services-visualization-gas/blob/main/src/index.ts#L71-L79

おわりに

Admina の API を GAS で叩くコードを初めて書いたのですが、Admina そのものより、TypeScript にハマりました。。。

GASの実行時間が気になるところだと思いますが、(従業員数にもよると思いますが)50 SaaS ぐらいなら30秒〜3分ってとこです。(Admina 側の API サーバーのご機嫌?によってばらつきがデカい)
大企業であれば Enterprise プランで30分制限になっている事が多いと思うので、大体のケースでそのまま使えるかと思います。

Discussion