GASでユーザーリストを取得してみた

前に、Google Workspace for Educationの年度更新について、Classroomのことが問題だと書いた。Classroomのオーナーでないと削除ができないのだけれど、誰がオーナーになっているのかわからない。だいたい、ドメインの中にどんなClassroomがあるのかだって管理者でもわからない。ということで、GASを使ってそこがわかるようにしてみた。

ClassroomのAPIからすぐに取得できるのが、オーナーとなっているユーザーIDでこれが21桁?の固有の数値となっている。EmailアドレスのIDではないのだ。これを、ユーザーのデータから取得しないと、だれなのかわからない。調べるとやっている人がいるので、参考に作ってみた。ユーザーを作るときに、depertmentに学校名を入れてあったので、それをorganizationsから引っ張ってくるところが結構難しかった。

参考にしたのはここ

josys-diary.com

作ったGASのコードは以下

/**
 * Lists all the users in a domain sorted by first name.
 * 参考は https://developers.google.com/apps-script/advanced/admin-sdk-directory
 * よくわからなかったorganizationsのところは
 * https://josys-diary.com/cloud/g_suite/707/
 */
function listAllUsers() {
  const sheet = SpreadsheetApp.getActiveSheet();//シートに書き込むための準備
  var values = new Array();//取得したデータを入れる2次元配列の準備
  var data = [];//一つの配列

  var pageToken;
  var page;
  var j = 0;
  do {
    page = AdminDirectory.Users.list({
      domain: 'ここは、自分のところのドメイン',
      orderBy: 'email',
      maxResults: 500,//MAXが500
      pageToken: pageToken
    });
    var users = page.users;
    if (users) {
      for (var i = 0; i < users.length; i++) {
        var user = users[i];
        if (user.primaryEmail.indexOf("s2") == -1) {//Emailのはじめがs2が児童生徒にしてあるので、それ以外の先生たち。来年はs3も出てくる
          if(user.organizations) {
            for (var m = 0; m < user.organizations.length ; m++ ) {
              if (user.organizations[m].primary == true) {
                var department = user.organizations[m].department;//ここが学校名が入っているところ
              }
            }
          } else {
            var department = "なし"
          }
          Logger.log('%s %s %s (%s) %s %s', j, user.id, user.name.fullName, user.orgUnitPath, user.primaryEmail, department);
          //user.orgUnitPath 入っているOU
          data = [j, user.id, user.name.fullName, user.orgUnitPath, user.primaryEmail, department];
          values.push(data);//2次元配列に入れる

        j++;
        }
      }
    } else {
      Logger.log('No users found.');
    }
    pageToken = page.nextPageToken;
  } while (pageToken);
  //values.shift();
  Logger.log(values);
  sheet.getRange(1,1,values.length,values[5].length).setValues(values);//とりあえず配列5番目のLengthを列数
}

これで、スプレッドシート

通し番号、ユーザーID、ユーザー氏名、OU、Email(ID)、学校名の一覧表ができる。

自分のところでは、管理コンソールから、ユーザーを作成するときに、「Employee Title」、「Department」、「Cost Center」を使うことができ、これを使ってフィルタを使って絞り込むことができたりしたので、ここを使っている。Departmentには、学校名を入れて使っている。なので、そこを使いたかった。

これで、Classroomの情報と合わせれば、どの学校の誰がオーナーになってClassroomを作ったのかがわかるようになった。このあと、学校にスプレッドシートを渡して、削除し忘れがチェックしてもらう予定だ。