AUTOMATION NOTE — 071

Admin SDK Reports APIでGAS・AppSheetの利用実態を可視化する:シャドーIT対策と稟議資料作成まで

Google WorkspaceのAdmin SDK Reports APIを利用すると、組織内のユーザーが実行したGoogle Apps Script (GAS) やAppSheetアプリケーションの活動ログを詳細に取得できます。これにより、社内で利用されている内製ツールの利用実態を把握し、シャドーIT対策やガバナンス強化のための情報収集が可能です。

この記事を読んだほうが良い人

  • 社内で誰がどのようなGASやAppSheetアプリを動かしているか把握できていない情シス担当者
  • 内製ツールのシャドーIT状況を経営層に報告するためのデータや資料作成に困っている管理者
  • Admin SDK Reports APIを使ってGoogle Workspaceの監査ログを分析したいと考えている方
  • GASやAppSheetの利用状況を棚卸しし、ガバナンスを強化したい企業の担当者

シャドーIT対策における内製ツールの課題

多くの企業で、業務効率化のために社員が自らGoogle Apps Script (GAS) やAppSheetを使ってツールを作成・運用するケースが増えています。これらは「内製ツール」として業務を支える一方で、情シス部門がその存在や利用実態を把握できていないと「シャドーIT」となるリスクがあります。

シャドーIT化が進むと、以下のような課題が発生します。

  • セキュリティリスク: 未承認のスクリプトやアプリが機密情報にアクセスしたり、意図しないデータ漏洩を引き起こしたりする可能性があります。
  • ガバナンスの欠如: 誰が、いつ、何を、どれくらいの頻度で使っているか不明なため、適切な管理や監査ができません。
  • 運用停止時の影響: 開発者が異動・退職した場合に、誰がそのツールの後を引き継ぐべきか分からず、業務が滞る可能性があります。
  • 経営層への説明責任: シャドーITの状況を把握できていないため、セキュリティ報告やガバナンス強化の稟議資料を作成できません。

これらの課題を解決するためには、まず「誰がどのGAS/AppSheetをどれくらい使っているか」という利用実態を定量的に把握することが第一歩です。

Admin SDK Reports APIの活用で利用状況を可視化する

Google WorkspaceのAdmin SDK Reports APIは、管理者向けにGoogle Workspaceの各種サービスに関する活動レポートを提供するAPIです。このAPIを使うと、ユーザーのログイン情報、管理者アクティビティ、そして今回注目する「ユーザーアクティビティ」の詳細なログを取得できます。

特にactivities.listエンドポイントを利用することで、特定のアプリケーション(GASやAppSheetなど)におけるユーザーの活動ログを日付やユーザーでフィルタリングして取得できます。

必要なAPIとスコープ

Admin SDK Reports APIを利用するには、Google Cloudプロジェクトで「Admin SDK API」を有効化し、適切なOAuth 2.0スコープを付与する必要があります。

必要なAPI: - Admin SDK API

必要なOAuth 2.0スコープ: - https://www.googleapis.com/auth/admin.reports.audit.activity (監査レポートへの読み取りアクセス)

このスコープにより、ユーザーの活動ログを含む監査レポートにアクセスが可能になります。

GASでReports APIを利用する準備

Google Apps Script (GAS) からAdmin SDK Reports APIを呼び出すには、「Advanced Google Services」を有効化します。

  1. GASプロジェクトを開きます。
  2. 左側のメニューから「サービス」アイコン(+記号)をクリックします。
  3. 「Admin SDK」を探し、「追加」をクリックします。
  4. 識別子としてAdminReportsが自動的に設定されていることを確認します。

これで、GASコード内でAdminReportsオブジェクトを通じてAPIを呼び出せるようになります。

GASでGAS・AppSheetの利用状況を取得するサンプルコード

実際にGASとAdmin SDK Reports APIを使って、GASやAppSheetの実行ログを取得し、Googleスプレッドシートに出力するサンプルコードを紹介します。

このコードは、指定した期間内のGASおよびAppSheetの実行イベントを検索し、ユーザー、イベントタイプ、イベント名、タイムスタンプなどの情報を抽出します。

/**
 * Admin SDK Reports API を使用して GAS および AppSheet の利用状況を取得し、スプレッドシートに出力する
 */
function getGasAppsheetUsage() {
  const SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID_HERE'; // 出力先スプレッドシートのID
  const SHEET_NAME = 'GAS_AppSheet_Usage'; // 出力先シート名

  // 取得期間の設定 (例: 過去30日間)
  const endDate = new Date();
  const startDate = new Date();
  startDate.setDate(endDate.getDate() - 30); // 30日前

  const startTime = startDate.toISOString();
  const endTime = endDate.toISOString();

  const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName(SHEET_NAME);
  if (!sheet) {
    throw new Error(`シート名 "${SHEET_NAME}" が見つかりません。`);
  }

  // ヘッダー行を書き込む
  sheet.clear();
  sheet.appendRow(['タイムスタンプ', 'ユーザーメール', 'アプリケーション', 'イベントタイプ', 'イベント名', 'パラメータ']);

  let pageToken = null;
  const allActivities = [];

  // GASアクティビティの取得
  Logger.log('GASアクティビティを取得中...');
  do {
    const response = AdminReports.Activities.list('all', 'script', {
      startTime: startTime,
      endTime: endTime,
      maxResults: 1000,
      pageToken: pageToken
    });

    if (response.items) {
      allActivities.push(...response.items);
    }
    pageToken = response.nextPageToken;
  } while (pageToken);

  // AppSheetアクティビティの取得
  pageToken = null; // ページトークンをリセット
  Logger.log('AppSheetアクティビティを取得中...');
  do {
    const response = AdminReports.Activities.list('all', 'appsheet', {
      startTime: startTime,
      endTime: endTime,
      maxResults: 1000,
      pageToken: pageToken
    });

    if (response.items) {
      allActivities.push(...response.items);
    }
    pageToken = response.nextPageToken;
  } while (pageToken);

  Logger.log(`取得したアクティビティ数: ${allActivities.length}`);

  const outputData = [];
  allActivities.forEach(activity => {
    // GASのイベントタイプ例: runScript, triggerRun, debugRun
    // AppSheetのイベントタイプ例: execute_app, create_app, delete_app, update_app
    const eventType = activity.events && activity.events.length > 0 ? activity.events[0].type : '';
    const eventName = activity.events && activity.events.length > 0 ? activity.events[0].name : '';

    // イベントパラメータを整形
    const params = activity.events && activity.events.length > 0 && activity.events[0].parameters ?
      activity.events[0].parameters.map(p => `${p.name}:${p.value || p.multiValue}`).join('; ') : '';

    outputData.push([
      new Date(activity.id.time).toLocaleString(),
      activity.actor.email,
      activity.id.applicationName,
      eventType,
      eventName,
      params
    ]);
  });

  if (outputData.length > 0) {
    sheet.getRange(sheet.getLastRow() + 1, 1, outputData.length, outputData[0].length).setValues(outputData);
    Logger.log('データがスプレッドシートに書き込まれました。');
  } else {
    Logger.log('対象期間中にGASまたはAppSheetのアクティビティは見つかりませんでした。');
  }
}

コードの解説

  1. スプレッドシートIDとシート名の設定: SPREADSHEET_IDSHEET_NAMEを、ログを出力したいGoogleスプレッドシートの情報に置き換えます。
  2. 期間設定: startDateendDateでログを取得したい期間を設定します。例では過去30日間のデータを取得しています。
  3. GASアクティビティの取得: AdminReports.Activities.list('all', 'script', { ... })で、Google Apps Scriptに関する全てのアクティビティを検索します。
    • 'all'は全てのユーザーを対象とすることを示します。
    • 'script'はアプリケーション名を指定し、GAS関連のログのみをフィルタリングします。
  4. AppSheetアクティビティの取得: 同様に'appsheet'を指定してAppSheetのアクティビティを取得します。
  5. データの整形と出力: 取得したactivityオブジェクトから、タイムスタンプ、ユーザーメール、アプリケーション名、イベントタイプ、イベント名、パラメータを抽出し、配列としてoutputDataに格納します。
  6. スプレッドシートへの書き込み: sheet.getRange(...).setValues(outputData)を使って、整形したデータを一括でスプレッドシートに書き込みます。

このスクリプトを定期実行するように設定すれば、常に最新の利用状況を把握できます。

取得データの分析と稟議資料への応用

スプレッドシートに出力されたデータは、シャドーITの実態把握や経営層への報告資料作成に役立ちます。

データの分析例

  • 利用頻度の高いGAS/AppSheetの特定: 特定のユーザーや部署で頻繁に実行されているスクリプトやアプリを洗い出します。
  • 利用ユーザーの可視化: どのユーザーがどのようなツールを多用しているかを把握し、業務依存度や影響範囲を評価します。
  • 不審なアクティビティの検出: 未知のスクリプトや、通常とは異なる時間帯に実行されているアクティビティがないかを確認します。

経営層向け稟議資料の記載例

取得したデータは、そのままでは単なるログの羅列です。情シス担当者として、このデータを分析し、経営層が意思決定できるような情報に加工して稟議資料を作成することが重要です。

稟議資料の構成案

  1. 現状分析(課題提起)
    • 社内におけるGAS/AppSheetの利用状況が不明確であること
    • シャドーIT化による潜在的なセキュリティリスクやガバナンス課題
    • 退職者発生時の業務継続性リスク
  2. 本施策の目的
    • 内製ツールの利用実態を可視化し、シャドーITリスクを低減する
    • 適切なガバナンス体制を構築し、セキュリティレベルを向上させる
    • 業務効率化に貢献する優良な内製ツールを発掘し、全社展開を検討する
  3. 実施内容
    • Admin SDK Reports APIを活用したGAS/AppSheetの利用ログ収集
    • 収集データに基づく利用実態の分析と棚卸し
    • (必要であれば)利用ガイドラインの策定、定期的な監査体制の構築
  4. 分析結果(データに基づく裏付け)
    • 利用ユーザー数とツール数の推移: 例「過去3ヶ月でGAS/AppSheetを利用しているユーザーはXX名、確認されたツール数はYY個に上ります。」
    • 高頻度利用ツールランキング: 例「特に利用頻度の高い上位5つのツールは、月間平均ZZ回実行されており、業務への影響が大きいと推測されます。」
    • リスク評価: 例「未承認のスクリプトが機密性の高いGoogle Driveデータにアクセスしている可能性のあるケースが○件確認されました。」
  5. 期待される効果
    • セキュリティリスクの低減とガバナンス強化
    • 業務継続性の確保
    • 内製ツールの有効活用と全社展開による生産性向上
  6. 今後のアクションプラン
    • 棚卸し結果に基づくリスク評価と対応(正規化、停止、改善など)
    • 内製ツール利用に関するポリシー・ガイドラインの策定と周知
    • 定期的な利用状況の監視とレポート
  7. 費用対効果
    • 本施策にかかる工数(GAS開発、分析時間など)
    • シャドーITによる潜在的損失(データ漏洩、業務停止など)との比較

このように、具体的なデータに基づいて現状とリスクを説明し、今後の対策と期待される効果を明確に伝えることで、経営層の理解と承認を得やすくなります。

Admin SDK Reports APIで取得できないこと

Admin SDK Reports APIは強力なツールですが、いくつか注意すべき制約があります。

  • スクリプトやアプリの具体的な処理内容: どのGASが実行されたか、どのAppSheetアプリが使われたかは分かりますが、そのスクリプトが具体的にどのような処理を行ったか(例: どのスプレッドシートのどのセルを更新したか)までは直接把握できません。これにはGASのApps Script Audit LogやAppSheetの詳細なログ設定が必要です。
  • オフライン実行のログ: GASの場合、Webアプリケーションとしてデプロイされたものやトリガーで実行されたものはログに残りますが、ローカル環境で直接実行されたスクリプトのログは取得できません。
  • 所有者の特定: Reports APIのログだけでは、GASやAppSheetの「誰が所有者か」を直接特定できません。これはGoogle Drive APIやAppSheet管理コンソールで補完する必要があります。

これらの制約を理解した上で、Reports APIを他のAPI(例: Drive API)や管理コンソールの機能と組み合わせて利用することで、より詳細な情報を取得し、包括的なガバナンス体制を構築できます。

まとめ

Admin SDK Reports APIは、Google Workspace環境におけるGASやAppSheetといった内製ツールの利用実態を可視化するための強力な手段です。これまで見えにくかったシャドーITの状況を定量的に把握することで、セキュリティリスクの評価、ガバナンス強化、そして経営層への具体的な報告が可能になります。

本記事で紹介したGASのサンプルコードを参考に、まずは自社環境でのGAS・AppSheetの利用状況を棚卸しすることから始めてみませんか。利用実態を把握し、適切な管理体制を構築することで、情シス部門はより安全で効率的なGoogle Workspace運用を実現できます。

コーポレートITのご相談はお気軽に

この記事で書いたような業務改善・自動化の設計から実装まで、DRASENASではコーポレートITの現場に寄り添った支援を行っています。 「まず相談だけ」でも大歓迎です。DRASENAS 公式サイトからお気軽にどうぞ。

CONTACT

御社の IT 部門、ここにあります。

「ITのことはあまりわからない」── そのような状態からで、まったく問題ございません。まずはお気軽にご相談ください。

一社ずつ、一から。