Google Apps Scriptでユーザの一括作成・削除をする【GAS】

検証用のGoogle Workspaceテナントを用意して、仮のユーザの一括作成や一括削除を行うことがままあります。手作業で数百人の検証用ユーザを作成・削除するのは手間が掛かりすぎます。

ということで、その際に利用するちょっとしたスクリプトを用意しました。

利用するスプレッドシート等

サービスとして、Admin SDKを追加する必要があります。Admin SDKを利用するため、ユーザロールか?特権管理者等のロールを持つ管理者でなければ利用することは出来ません

検証用なのでパスワードは固定で、changePasswordAtNextLoginについてはfalseでも良いのではないかとは思います。

Google Apps ScriptのAdmin SDKでユーザ作成フォームを作る【GAS】

ソースコード

ユーザ一括作成

userシートの内容を読み取って一括で作成していきます。AdminDirectory.Users.insertに対してメアドや姓名を渡して構築したものを使って追加していきます。

通常は、AdminDirectory.Users.insert(user)で良いのですが、競合アカウントがあった場合強制的に置き換えられる恐れがあるため、resolveConflictAccount:trueを追加しています。GWS側の設定に準拠するので、事前に設定を変えておく必要があります。

競合アカウントを検知するとそこで処理が止まります。

function makeAccount() {
  //スプレッドシートデータの取得
  let sheet = SpreadsheetApp.getActiveSpreadsheet();
  let ui = SpreadsheetApp.getUi();

  //シートを取得
  let ss = sheet.getSheetByName("user");

  //データを取得する.
  let dataman = ss.getRange("A2:D").getValues();
  let datalength = dataman.length;

  //連続でユーザ作成
  let result;
  for(let i = 0;i<datalength;i++){
    //レコードを一個取り出す
    let rec = dataman[i];

    //空の場合はスルーする
    if(rec[0] == ""){
      continue;
    }

    //ユーザ作成
    result = addUser(rec[3], rec[2], rec[1]);
  }

  //処理終了
  ui.alert(result)
}

//アカウントを作成し、デフォルトパスワードを返す関数
function addUser(mail, firstname, familyname) {
  try{
    //アカウント作成メインルーチン
    let pass = String("ここにパスワードを入れる");
    let user = {
      primaryEmail: mail,
      name: {
        givenName: firstname,
        familyName: familyname
      },
      password: pass,
      changePasswordAtNextLogin: true
    };
    user = AdminDirectory.Users.insert(user,{resolveConflictAccount:true});
    return "作成完了。パスワードは" + pass + "です。";
  }catch(e){
    return e.message;
  }
}

図:競合アカウントを検出した場合のメッセージ

ユーザ一括削除

アカウントの削除は簡単で、AdminDirectory.Users.removeに対してメアドを渡すだけで削除することが可能です。

//ユーザ一括削除
function deleteAccount(){
  //スプレッドシートデータの取得
  let sheet = SpreadsheetApp.getActiveSpreadsheet();
  let ui = SpreadsheetApp.getUi();

  //シートを取得
  let ss = sheet.getSheetByName("user");

  //データを取得する.
  let dataman = ss.getRange("A2:D").getValues();
  let datalength = dataman.length;

  //連続でユーザを削除する
  for(let i = 0;i<datalength;i++){
    //レコードを一個取り出す
    let rec = dataman[i];

    //ユーザ作成
    let result = delUser(rec[3]);
  }

  //処理終了
  ui.alert("作成終わったよ")
}

//アカウントを削除する
function delUser(mail) {
  //アカウント作成削除ルーチン
  let result = "";
  try{
    result = AdminDirectory.Users.remove(mail);
  }catch(e){
    result = e.message
  }

  return result;
}

ユーザ一覧を取得する

ちなみに、Google Workspaceのテナントに登録されたユーザの情報を取得したい場合には以下のようなコードになります。

1回あたり最大500件まで取得できますがpageTokenの値がある場合次の500件を取得するようにループを設定しています。page.user以下に色々な情報が詰まっており、これがここのユーザの属性情報になります。

以下の動的グループのエントリにもありますが、独自に追加したカスタム属性も取得することができ、user.customSchemas以下に独自設定した属性が収められてるので、これを指定することで取得できます。

属性情報が空っぽの場合エラーとなるので、isnotempty関数を噛ませてNullチェックをし空で返すようにしています。

Google Workspaceの動的グループで楽をしよう【GAS】

//ドメイン指定
var domain = "hogehoge.com"

//アカウント一覧取得
function getAllUsers(){
  //一時変数
  let pageToken;
  let page;

  //UI取得
  let ui = SpreadsheetApp.getUi();

  //スプシを取得
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName("アカウント一覧");

  //シート情報をクリアする
  sheet.getRange("A2:I").clearContent();

  //ループで500件ずつ取得する
  do {
    page = AdminDirectory.Users.list({
      domain: domain,
      maxResults: 500,
      orderBy: 'givenName',
      pageToken: pageToken
    });

    //取得したユーザリストが空の場合
    let users = page.users;
    if (!users) {
      ui.alert("ユーザがいませんでした。");
      return;
    }

    //ユーザ情報を書き出し
    var array = [];
    for (const user of users) {
      //organizationsの値を取得してトラップする
      let orgman;
      try{
        orgman = user.organizations[0];
      }catch(e){
        orgman = "";
      }
      
      //一時配列を作成し値を格納する
      let temparr = [
        user.id,
        user.primaryEmail,
        isnotempty(user.name,"familyName"),
        isnotempty(user.name,"givenName"),
        isnotempty(user.name,"displayName"),
        isnotempty(user.customSchemas,"extensionAttribute1"),
        isnotempty(orgman,"department"),
        isnotempty(orgman,"title"),
        user.orgUnitPath
      ]
 
      //書き出し用配列に追加
      array.push(temparr);
    }

    pageToken = page.nextPageToken;
  } while (pageToken);

  //スプレッドシートに書き出しする
  let lastColumn = array[0].length; //カラムの数を取得する
  let lastRow = array.length;       //行の数を取得する
  sheet.getRange(2,1,lastRow,lastColumn).setValues(array); 

  //完了通知
  ui.alert("作業完了しました。")
}

//Nullチェックして空ならば空で返す関数
function isnotempty(target,element){
  //対象が空の場合は値も空で返す
  if(target == "" || target == null){
    console.log(element + "はnullだよ")
    return "";
  }

  //空じゃない場合の処理
  let tempelement = target[element];

  //取得した要素の値を返す
  return tempelement;
}

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)