前提・実現したいこと
管理者権限付与済みのアカウントで実行
APIを有効化済み
エラーを解決し、全グループの全メンバーアドレス取得を行いたいです。
発生している問題・エラーメッセージ
TypeError: Cannot read property 'length' of undefined
該当のソースコード
// 全グループの、全メンバーアドレス取得 // スプレッドシートを開いた際に、メニューに「スクリプト実行」を追加する function onOpen() { SpreadsheetApp.getUi() .createMenu("スクリプト実行") .addItem("メンバーアドレス一覧取得", "confirmLoadGroupMembersAddress") .addToUi(); } // 確認を表示してOKなら一覧読み込み function confirmLoadGroupMembersAddress() { // ドメイン一覧を取得 const domains = getDomains(); // 開始確認 const ui = SpreadsheetApp.getUi(); // 読み込み処理 var res = ui.alert( "確認", "このシートを消去して全グループの情報を読み込みます。\nよろしいですか?", ui.ButtonSet.OK_CANCEL); if (res == "OK") { loadGroupMembersAddress(domains); ui.alert( "終了", "完了しました。OKを押すと表示されます。", ui.ButtonSet.OK); } else { ui.alert( "キャンセル", "キャンセルしました", ui.ButtonSet.OK); } } // 対象とするドメイン一覧を取得 function getDomains() { // 現在ログインしているユーザー情報を元に、全ドメイン一覧を取得 var mail = Session.getActiveUser().getEmail(); var user = AdminDirectory.Users.get(mail); var domains = AdminDirectory.Domains.list(user.customerId).domains; // ドメイン名のリストを作成して返す var list = []; for (var i = 0; i < domains.length; i++) { var domain = domains[i]; list.push(domain.domainName); } return list; } // 全グループについて取得してシートに出力 function loadGroupMembersAddress(domains) { // ヘッダーの定義 const header = ["GroupAddress", "Name", "DirectMembersCount", "UserAddress"]; // 追加される行を保持する配列 var rows = []; // ヘッダ行を出力 rows.push(header); // ドメインごとにループ for (var i = 0; i < domains.length; i++) { var domain = domains[i]; // 取得数制限にかかる際のページング var groupNextPageToken = null; // グループごとのループ do { var grouplist = AdminDirectory.Groups.list({ domain: domain, nextPageToken: groupNextPageToken }); // グループが存在しなければ終了 if (!grouplist.groups) break; // 次ページがあるときはトークンが入る groupNextPageToken = grouplist.nextPageToken; // 各グループについての処理 for(var j = 0; j < grouplist.groups.length; j++){ var group = grouplist.groups[j]; var memberNextPageToken = null; // グループに所属するメンバーの取得 do { var memberlist = AdminDirectory.Members.list(group.email, { pageToken: memberNextPageToken }); // 次ページがあるときはトークンが入る memberNextPageToken = memberlist.nextPageToken; // 今回(このページ)で取得できた分を一覧に追加 for (var k = 0; k < memberlist.members.length; k++){ var member = memberlist.members[k]; var cols = []; cols.push(group.email); cols.push(group.name); cols.push(group.directMembersCount); cols.push(member.email); rows.push(cols); } } while (memberNextPageToken); } } while (groupNextPageToken); } // 以降、スプレッドシートへの出力 // アクティブなシート取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 左上セルを基準に、最終行まで削除(書式は残す) sheet.getRange(1, 1, sheet.getMaxRows(), header.length).clearContent(); // 書き込み sheet.getRange(1, 1, rows.length , header.length).setValues(rows); }
補足情報(FW/ツールのバージョンなど)
https://qiita.com/kirurobo/items/9b2f99bc12672e30b5ce
↑を、まるっと参考にしてます。
質問内容的に Google Apps Script のタグを付けましょう。
ちなみに 参考にされたサイト通りシートに追加されたメニューから実行しましたか?