Gemini for GWSライセンス付与・削除をGASでいい感じにやる

2025/01/12に公開

Google Workspaceでは、ユーザーごとのライセンスを管理画面上から操作する場合、個別に付与する、csvを利用する、組織部門を利用する、のどれがが一般的な方法のようです。しかし、どれも煩雑なため、本記事ではGoogle Apps Scriptを利用したライセンス管理の自動化手順を解説します。


さて、何故このような記事を今のタイミングでまとめたかというと、筆者は以下のようにGemini for Google Workspaceのライセンス付与時に困った体験をしたためです。
今回は、取得したGeminiのライセンスを利用し、Gemini自身にGASとこの記事の殆どを書いていただきました。Gemini便利!

https://x.com/helosshi/status/1877520703529922948
https://x.com/c_yamax/status/1877648408133165201
https://x.com/helosshi/status/1877650189164441799


前提条件

Google Apps Scriptでライセンス管理を行うには、以下の条件を満たしている必要があります。

1. Google Workspace管理者権限

ライセンス管理を行うには、Google Workspace管理者アカウントでスクリプトを実行する必要があります。

2. スプレッドシートの準備

以下のフォーマットでスプレッドシートを用意してください。

A列 B列 C列
メールアドレス 操作 結果
user1@example.com 追加
user2@example.com 削除
  • A列: 処理対象のメールアドレス。
  • B列: 実行する操作(「追加」または「削除」)。
  • C列: 実行結果が記録されます。

3. Apps Scriptでサービスを追加

Google Apps Scriptには、Google Workspace APIの一部が標準で提供されています。以下の手順で必要なサービスを追加してください。

サービスの追加手順

  1. Apps Scriptエディタを開く
  2. 「サービスを追加」 をクリック。
  3. 以下のサービスを追加:
    • Admin Directory API (AdminDirectory)
    • Licensing API (AdminLicenseManager)

4. Google プロダクト ID と SKU ID

Google プロダクト ID と SKU IDにSKUに関する情報が載っています。
今回のスクリプトでは

  • Product ID (productId) 101047 Gemini for Google Workspace
  • SKU ID (skuId) 1010470001 Gemini Enterprise

を利用しています。

これでスクリプトでライセンス管理を行う準備が整います。


スクリプトコード

以下のスクリプトをGoogle Apps Scriptエディタに貼り付けてください。

function processLicenseAssignments() {
  const properties = PropertiesService.getScriptProperties();
  const spreadsheetId = properties.getProperty("SPREADSHEET_ID");
  const skuId = "1010470001"; // SKU ID
  const productId = "101047"; // Product ID

  const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  const sheet = spreadsheet.getSheets()[0]; // 1枚目のシートを使用

  const lastRow = sheet.getLastRow();
  if (lastRow < 2) {
    Logger.log("データが見つかりません。処理を終了します。");
    return;
  }

  const data = sheet.getRange(2, 1, lastRow - 1, 2).getValues();
  const results = []; // 処理結果を格納する配列

  for (let i = 0; i < data.length; i++) {
    const email = data[i][0].trim();
    const action = data[i][1].trim();
    let result = "";

    if (!email) {
      result = "無効なメールアドレス";
    } else if (action === "追加") {
      const isSuccess = handleLicenseAssignment(email, productId, skuId, "insert");
      result = isSuccess ? "追加済" : "追加失敗";
    } else if (action === "削除") {
      const isSuccess = handleLicenseAssignment(email, productId, skuId, "delete");
      result = isSuccess ? "削除済" : "削除失敗";
    } else {
      result = "無効な操作";
    }

    results.push([result]);
    Utilities.sleep(500); // 500msの遅延を追加
  }

  sheet.getRange(2, 3, results.length, 1).setValues(results);
}

function handleLicenseAssignment(email, productId, skuId, action) {
  try {
    if (action === "insert") {
      AdminLicenseManager.LicenseAssignments.insert(
        { userId: email },
        productId,
        skuId
      );
      return true; // 成功
    } else if (action === "delete") {
      AdminLicenseManager.LicenseAssignments.delete(productId, skuId, email);
      return true; // 成功
    } else {
      Logger.log(`無効な操作: ${action}`);
      return false; // 無効な操作
    }
  } catch (e) {
    Logger.log(`エラー (ユーザー: ${email}): ${e.message}`);
    return false; // 失敗
  }
}

実行結果

スクリプトを実行すると、スプレッドシートのC列に処理結果が記録されます。

A列 B列 C列
user1@example.com 追加 追加済
user2@example.com 削除 削除済
user3@example.com 削除 削除失敗
user4@example.com 追加 追加失敗

注意点

  1. スクリプト実行時の権限

    • Google Workspace管理者アカウントでスクリプトを実行してください。
  2. スコープの自動設定

    • Apps Scriptが自動的に以下のスコープを設定します。
      https://www.googleapis.com/auth/apps.licensing
      https://www.googleapis.com/auth/admin.directory.user
      
  3. APIクォータ

    • リクエスト数が多い場合、Google APIのクォータ制限に注意してください。
  4. スクリプトプロパティの設定

    • "プロジェクトの設定" > "スクリプト プロパティ"にて"SPREADSHEET_ID"を設定してください。
    • "SPREADSHEET_ID"はスプレッドシートのURL"/d/"と"/edit"の間です。

コードの解説

以下のコードでは、Google Apps Scriptを利用してGoogle Workspaceのライセンス管理を行っています。ここでは、主な関数の役割とその処理を詳しく解説します。

1. processLicenseAssignments 関数

概要

この関数は、スプレッドシートからデータを読み取り、メールアドレスごとにライセンスの割り当てまたは削除を実行します。結果はスプレッドシートのC列に記録されます。

主な処理の流れ

  1. スプレッドシートからデータを取得:

    • A列に記載されたメールアドレスとB列の操作(追加または削除)を取得します。
  2. 各メールアドレスに対して処理を実行:

    • B列の内容に応じて、handleLicenseAssignment 関数を呼び出し、ライセンスの追加または削除を実行します。
  3. 処理結果を記録:

    • 成功または失敗の結果をC列に書き込みます。

ポイント

  • データ検証:
    • A列に無効なメールアドレスが含まれている場合は、「無効なメールアドレス」として処理結果を記録します。
  • 遅延処理:
    • APIリクエストがクォータ制限にかからないように、各リクエストの間に500msの遅延を追加しています。

2. handleLicenseAssignment 関数

概要

この関数は、指定されたメールアドレスに対してライセンスの追加または削除を実行します。Apps ScriptのAdminLicenseManagerライブラリを利用しています。

主な処理の流れ

  1. 操作の種類を判定:

    • 引数 action に基づいて、ライセンスを追加するか削除するかを決定します。
  2. ライセンスの追加(insert:

    • AdminLicenseManager.LicenseAssignments.insert を使用してライセンスを追加します。
  3. ライセンスの削除(delete:

    • AdminLicenseManager.LicenseAssignments.delete を使用してライセンスを削除します。
  4. エラーハンドリング:

    • 操作中にエラーが発生した場合、その内容をログに記録し、関数呼び出し元に失敗を通知します。

ポイント

  • 動的な操作切り替え:
    • action 引数で「追加」と「削除」を切り替えます。
  • エラーハンドリング:
    • 予期しないエラーが発生した場合、エラーメッセージをログに記録し、呼び出し元に false を返します。

その他の補足

1. 遅延処理の重要性

APIリクエストが多い場合、Google APIのクォータ制限に達する可能性があります。そこで、各リクエストの間に短い遅延(500ms)を挟むことで、制限に引っかかるリスクを軽減しています。

2. 結果の記録

処理結果をスプレッドシートのC列に記録することで、各メールアドレスごとの処理状況を視覚的に確認できるようにしています。


おわりに

ぜひ、このスクリプトを活用して、Google Workspaceのライセンス管理を効率化してください。質問や改善案があれば、ぜひコメントで教えてください!


Geminiすごいですね。ちゃんとGASも一定動作することを確認していますが、お手元で実施される場合は少量からお試しください。管理者の権限不足などで失敗する場合もままあります。
スクリプトに関する間違いなどが有りましたら、指摘していただけると幸いです。
にしても、管理画面からcsvをインポートして大半がエラーになるのは遅延処理とか加えてくれればいいんじゃないんかな...と思いました。
あと、ここまで書いてきて、Google Groupとライセンス付与GASをいい感じにするとグループからのライセンス管理もできるんじゃないかなと思いつきました。(いい感じにできたら記事にします)

最後に、howdyさんのこの話はあとから見返してみて発見がありました。SKU IDから読み取れる歴史良いですね。

https://x.com/howdy39/status/1877521501110546451

それでは👋

Discussion