3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AEONAdvent Calendar 2024

Day 11

GWSアカウントの一元管理運用(GASでのミニマム管理)

Last updated at Posted at 2024-12-11

はじめに

GoogleWorkSpaceアカウントの管理を行う必要があったため、一元管理の方法をまとめました。
アカウント管理は手作業で行うと、意外と時間と手間がかかります。
アカウントの作成、削除、情報の更新などを自動化して、アカウント管理を効率的に行う事を目的に、スプレッドシート上での管理を実装してみます。

準備

APIの有効化

GASからAdminDirectory SDKの実行をする場合、事前にAdmin SDK APIの有効化が必要。
管理コンソール >> APIとサービス >> APIとサービスを有効にする
image.png

AppScript設定

サービスの追加

GASのスクリプトエディタの「サービス」から、「AdminDirectory」を追加
image.png

プロジェクト設定

プロジェクト設定から、Google Cloud Platformのプロジェクト番号を追加

実装

アカウント情報の取得

アカウント情報のメールアドレスを取得して、スプレッドシートに表示。
AdminDirectory.Users.list()でユーザーに関する情報を取得し、今回はgivenName、familyName、primaryEmailを表示します。givenNameでソートをかけてます。
https://admin.googleapis.com/admin/directory/v1/users

gws_get.gs
function getUsers(){
  let pageToken;
  let page;
  let result = [];
  
  do {
    page = AdminDirectory.Users.list({
      domain: 'YOUR_DOMAIN',
      orderBy: 'givenName',
      maxResults: 500,
      pageToken: pageToken
    });
    let users = page.users;
    if (users) {
      users.forEach(x=> result.push([x.name.familyName,x.name.givenName,x.primaryEmail]))
    }
    pageToken = page.nextPageToken;
  }while (pageToken)
  
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");
  sh.clear();
  SpreadsheetApp.flush();
  const menu = ["","","Mail"];
  result.unshift(menu);
  sh.getRange(1,1,result.length,result[0].length).setValues(result);      
  SpreadsheetApp.flush();
}

実行するとスプレッドシートに取得したアカウントリストが表示されます。
実行したアカウントに認証を求められるので、下記どちらかのスコープが付いている事に注意。
https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.user.readonly

アカウントの作成

スプレッドシートに記載したメールアドレスと名前から、アカウントを作成します。

image.png

こちらもスコープがある事に注意。
https://www.googleapis.com/auth/admin.directory.user

gws_create.gs
function createUsers() {
  // スプレッドシートのIDとシート名を指定
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("アカウント登録用");
  var data = sh.getDataRange().getValues();

  // ヘッダー行をスキップ
  data.shift();
  //スプレッドシートに記載されたユーザーデータを取得
  data.forEach(function(row) {
    var fName = row[0];
    var gName = row[1];
    var email = row[2];

    //登録するユーザーを作成
  var user = {
    primaryEmail: email,
    name: {
      familyName: fName,
      givenName: gName
    },
    password: 'password'
  };

    //ユーザー作成
    try {
      var newUser = AdminDirectory.Users.insert(user);
      Logger.log('ユーザーを作成しました: ' + email);
    } catch(error) {
      Logger.log('ユーザーの作成に失敗しました: ' + error.message);
    }
  });
}

アカウントの削除

スプレッドシートに記載したメールアドレスと名前から、アカウントを削除します。

gws_get.gs
function deleteUsers() {
  // スプレッドシートのIDとシート名を指定
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("アカウント削除用");
  var data = sh.getDataRange().getValues();

  // ヘッダー行をスキップ
  data.shift();

  data.forEach(function(row) {
    var userKey = row[2];

  try {
      var deleteUser = AdminDirectory.Users.remove(userKey);
      Logger.log('ユーザーを削除しました: ' + userKey);
    } catch(error) {
      Logger.log('ユーザーの削除に失敗しました: ' + error.message);
    }
  });
}

その他応用

カスタム属性の確認

サービスアカウントから、GWSアカウントのカスタム属性を確認してみます。

gws_custom_attributes.gs
function getUserCustomAttributes() {
  // スプレッドシートのIDとシート名を指定
  var spreadsheetId = 'SPREADSHEET_ID';
  var sheetName = 'Sheet1';

  // サービスアカウントの認証情報
  var serviceAccount = getServiceAccountClient();

  // スプレッドシートからユーザーのメールアドレスを取得
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  var data = sheet.getDataRange().getValues();
  var userEmail = data[0][0]; // A1セルにメールアドレスを記載

  // ユーザーのカスタム属性を取得
  try {
    var user = serviceAccount.users().get({
      userKey: userEmail
    }).execute();
    var customAttributes = user.customSchema;
    Logger.log('カスタム属性: ' + JSON.stringify(customAttributes));
  } catch(error) {
    Logger.log('ユーザーの取得に失敗しました: ' + error.message);
  }
}

// サービスアカウントの認証情報を取得する関数
function getServiceAccountClient() {
  // サービスアカウントのキーファイルのパスを指定
  var keyFile = 'path/to/your/key.json';

  return new GoogleAppsScript.OAuth2.ServiceAccount(
    'https://www.googleapis.com/auth/admin.directory.user',
    keyFile,
    'YOUR_DOMAIN'
  );
}

動的グループのクエリの管理

動的グループの設定時に作成する、クエリの編集や確認方法です。

gws_group_query.gs
function getDynamicGroupQuery() {
  // スプレッドシートのIDとシート名を指定
  var spreadsheetId = 'SPREADSHEET_ID';
  var sheetName = 'Sheet1';

  // サービスアカウントの認証情報
  var serviceAccount = getServiceAccountClient();

  // スプレッドシートから動的グループのIDを取得
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  var data = sheet.getDataRange().getValues();
  var groupId = data[0][0]; // A1セルにグループIDを記載

  // 動的グループのクエリを取得
  try {
    var group = serviceAccount.groups().get({
      groupKey: groupId
    }).execute();
    Logger.log('動的グループのクエリ: ' + group.query);
  } catch(error) {
    Logger.log('動的グループの取得に失敗しました: ' + error.message);
  }
}

// サービスアカウントの認証情報を取得する関数
function getServiceAccountClient() {
  // サービスアカウントのキーファイルのパスを指定
  var keyFile = 'sample_key.json';

  return new GoogleAppsScript.OAuth2.ServiceAccount(
    'https://www.googleapis.com/auth/admin.directory.user',
    keyFile,
    'YOUR_DOMAIN'
  );

まとめ

Admin SDK APIを使用することで、スプレッドシート上でのアカウント管理が可能です。
スケジューラー設定から定期実行も可能なので、フォームと組み合わせたりするとフォーム申請からアカウント作成も自動化出来ますね。
また、組織部門やグループの管理、動的グループのクエリ編集も可能ですので、組織管理にも使えます。
アカウント管理はどこでも発生する業務ですが、管理方法の最適化が毎度難しく悩むので、汎用性のある安価で堅牢で簡易な方法が欲しいです。

参考

https://developers.google.com/admin-sdk/reference-overview?hl=ja
https://zenn.dev/acompany/articles/51e1dcc83279ee
https://www.wantedly.com/companies/rakus/post_articles/140168

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?