ユーザーの参加グループをGASで出力(Google Workspace)

Google Workspace(G Suite)を利用している時に、ユーザーがどのグループ(メーリングリスト)に参加しているか調べると思いますが、Google管理コンソールでは、参加しているグループの一覧表示する場合、最大50件しか表示されない。
参加しているグループがそれ以上の場合は、ページ送りして確認するしかありません。(2021年1月現在)
また、管理者であってもその一覧をエクスポートすることはできないので、今回GAS(Google Apps Script)を利用してスプレッドシートに出力することにしました。

スプレッドシートを準備

スプレッドシートを準備します。
今回、C1のセルに検索するユーザーのメールアドレスを記入し、[検索]という画像ボタンを用意して、GASを実行します。
A5のセル以下に出力されます。
※出力には数分(遅い)掛かります。

また、[クリア]という画像ボタンを用意し、押すことでC1とA5~A500までの値を削除する機能も付けてます。

※操作上便利かな?と思ったので[検索][クリア]ボタンを付けたものを紹介してますが、本来は必要ありません。ですので、必要に応じて準備してください。

 

スクリプトエディタの準備

スクリプトエディタでは、サービスとして『AdminDirectory』を追加しております。
このことから、実行は特権管理者のみが行えますので、それ以下の権限の方は実行できません。

 

 

 

 

 

 

 

スクリプトについて

・rClearの動き

スプレッドシートの[クリア]ボタンを押すと実行され、C1とA5~A500までの値を削除します。

・getListMainの動き

※実行前にdomainの場所に利用中のドメインを記述してください

[14行目~]実行時にrClearと同様にA5~A500までの値を削除します。
[18行目~]C1のデータを取得します
[25行目~]グループ名を取得します。
 仕様上の最大200件まで取得します。それ以上にグループが作成されている場合があるので、pageTokenを取得し、次のリストを取得します。
[50行目~]pegeTokenが無くなるまで、whileで回し続けます。
[36行目~]グループ名を取得したら、その処理の中でC1に記述されたユーザーのメールアドレスを探します。
 マッチしたら、グループアドレスを格納します
[42行目]グループリストの取得を終えたら、スプレッドシート出力用の関数(values)に格納します
[61行目]スプレッドシートにのA5出力します
[63行目~]完了メッセージを表示させます。

スクリプトはこちら

[shell]
function rClear() {
	var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
	var range1 = ss.getRange("C1");
	var range2 = ss.getRange("A5:A500");
	range1.clearContent();
	range2.clear();
}

function getListMain() {
	let domain = '// ここに利用ドメインを記述'
	let endFlag = false;
	let token = '';

	var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
	var range = ss.getRange("A5:A500");
	range.clear();

	var s_member = ss.getRange("C1").getValue();
	var values = [];

	// メッセージ用
	var ui = SpreadsheetApp.getUi();
	var msg = "";

	while(!endFlag){
		try {
			var groupList = AdminDirectory.Groups.list({
					domain: domain, //使用しているドメイン
					maxResults: 200, //取得する件数
					pageToken: token
			});
			
			for(var i = 0; i < groupList.groups.length; i++){
				var value = [];
				
				var members = AdminDirectory.Members.list(groupList.groups[i].email).members;
				if(members){
					for(var j = 0; j < members.length; j++){
						if(s_member == members[j].email){
							console.log(groupList.groups[i].email);
							value.push(groupList.groups[i].email);
							values.push(value);
						}
					}
				}
			}
			

			
			if(groupList["nextPageToken"] == null){
				console.log("Group nextPageToken null: "+ groupList["nextPageToken"])
				endFlag = true;
			}else{
				token = groupList["nextPageToken"];
			}

		} catch(error) {
			console.log(error);
		}
	}
	ss.getRange(5, 1,values.length,values[0].length).setValues(values);

	msg = "完了しました";
	ui.alert(msg);

	console.log("END")
}
[/shell]

 

end