Google Apps Scriptでグループメンバーとカレンダーリソースを取得する【GAS】
現在開発中のアプリでちょっと必要になったので作ってる「グループアドレスからメンバー一覧取得」と「カレンダーのリソースを取得」の2本。小ネタをひとまとめにして、エントリーを作成しています。これらは都度都度アプリからAPI問い合わせして取りに行ってるとそれだけで無駄が多いので、スプレッドシートに書き出し、アプリからはそれをフィルタして利用するようにすることで、高速化しています。
取得したデータはQuery関数を使って結合してからアプリ側で利用する仕組みにしています。
目次
今回利用するスプレッドシート等
- Group & Resource Getter - Google Spreadsheet
- GroupsApp Class - Google Developer
- Admin ADK API - Google Developer
グループアドレスの中に入ってるメンバー(また、その中にさらにグループが入ってる場合はその中のメンバーも)を一覧で取得しスプレッドシートに書き出します。また、Google Calendarの会議室などの「リソース」と呼ばれるデータも一括で取得しスプレッドシートに書き出します。
どちらも管理者権限を必要とするAdmin SDK APIを利用する事で取得することが出来ます(GroupsAppでもグループメンバーは取得できるのですが制約があります)。これらは夜中の0時にでも発動するようにしておけば、自動的に最新の状態に更新されるのでより便利になると思います。
グループ作成については、過去にエントリーでまとめています。
事前準備
GroupsAppで取得する場合は不要ですが、Admin SDKを使ってのグループメンバー取得やカレンダーリソースは特権管理者の権限を持っているものでなければ使えないサービスを追加する必要があります。
以下に追加方法を記します。
- スクリプトエディタを開く
- 左サイドバーのサービスの+をクリックする
- Admin SDKを探してクリックし、追加をクリックする
- AdminDirectoryとしてサービスが追加された
これで、以降はAdminDirectoryというサービスで各種特権管理者用のメソッドを実行する事が可能になります。
図:Admin SDKのサービスを追加した
グループアドレスのメンバーを取得する
GroupsAppで取得する場合
こちらのコードはGoogle Apps Scriptの標準のメソッドにてグループアドレス内のメンバーのデータを取得する事が可能です。但し1度にとれるメンバー数が200名までのようです(通常はあまり困ることはないものの、全社員が参加してるMLなどですと超える可能性があります)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
//GroupsAppでグループメンバーを取得する(子グループ以下も取得) function getGroupsMembers(){ //取得対象のグループアドレス var groups = "ここに対象のグループアドレスを入れます"; //グループを取得する var group = GroupsApp.getGroupByEmail(groups); //書き出し用の配列を用意する var array = getMemberlist(group,groups); var grouparr = getChildGroupman(group); //グループアドレスを走査する while(grouparr.length > 0){ //先頭のアドレスを一個取り出す var groupman = grouparr[0]; //所属メンバーを調べる group = GroupsApp.getGroupByEmail(groupman); var members = getMemberlist(group,groups); //メンバーをarrayに追加する array = mixarray(array, members); //子グループを調べる var tmpgroup = getChildGroupman(group); //子グループアドレスを追加する for(var z = 0;z<tmpgroup.length;z++){ grouparr.push(tmpgroup[z]); } //ウェイトを入れる Utilities.sleep(1000); //先頭のグループアドレスを削除する grouparr.shift(); } //arrayの中身から重複アドレスを排除 let new_array = [...new Set(array.map(JSON.stringify))].map(JSON.parse); //スプレッドシートを取得 var prop = PropertiesService.getScriptProperties(); var ssid = prop.getProperty("sheetid"); var ss = SpreadsheetApp.openById(ssid).getSheetByName("member"); //シートをクリアする ss.getRange("A2:B").clearContent(); //シートに一括書き出し let lastColumn = new_array[0].length; //カラムの数を取得する let lastRow = new_array.length; //行の数を取得する ss.getRange(2,1,lastRow,lastColumn).setValues(new_array); } //グループのメンバー情報を取得する function getMemberlist(group,groups){ //配列を用意する var member = []; //グループメンバーを取得する var users = group.getUsers(); //直属メンバー情報を取得する for (var i = 0; i < users.length; i++) { //ユーザを取得する var user = users[i]; //アドレスを取得する var address = user.getEmail() //一時配列に追加する var temparr = [ groups, address ] //配列に追加 member.push(temparr) } //2次元配列を返す return member; } //子グループアドレスを取得して返す function getChildGroupman(group){ //配列を用意する var grouparr = []; //子グループを取得する try{ //子グループを取得する var childGroups = group.getGroups(); //子グループのグループアドレスを取得する for (var j = 0; j<childGroups.length; j++) { var childGroup = childGroups[j]; grouparr.push(childGroup.getEmail()) } }catch(e){ //エラー時は子グループが無い } //1次元配列を返す return grouparr; } //二次元配列を結合する function mixarray(array1, array2){ //返却用配列を用意 var array3 = []; array3 = array1.slice(); //1レコードずつpush for(var i = 0; i < array2.length; i++){ array3.push(array2[i]); } //結合2次元配列を返す return array3; } |
- getGroupMembersがメインの関数となります。こちらから他の関数に処理を渡したり配列を書き出したりを行います。
- GroupsApp.getGroupByEmailにて対象のグループアドレスを取得させ、ここからメンバーと子グループアドレスを別々の関数で処理させます
- getMemberlist関数がgroupの中からメンバーのメアドをグループアドレス名と合わせて二次元配列で返す関数です
- getChildGroupman関数がgroupの中からグループアドレスを取り出し、1次元配列で返す関数です。
- メンバーはarrayの配列にどんどん結合させていきます。
- 子グループの一覧であるgrouparrを走査して、同様にメンバーとグループアドレスを取り出していきます。
- 連続して処理をすると429エラーになるので1週ずつUtilities.sleepでウェイト処理を挟んでおきます。
- 最後にgrouparrの先頭の値を削除する。もし、前の処理でグループアドレスがあれば再度Whileループが回ります。
- arrayの中身に於いて、重複してるメンバーが居れば削除する処理を実行してnew_arrayとし、最後にMemberシートをクリアして一括でnew_arrayの値を書き出します。
- メンバーの取得は読み込みの権限がないものは取得ができません。
- Google Workspaceの特権管理者でgetGroupByEmailにて取得しようとした場合、グループの設定においてメンバーを表示できるユーザが組織全体でなければエラーになります(特権管理者がそのグループに所属していない場合)。また、組織全体になっていた場合でも、グループのメンバーが取れたり取れなかったりと不安定な状態にあります(2023/10/30時点)。Admin SDKで取得するようにしたほうが良いでしょう。
この処理によって、親グループアドレス名とメンバーのアドレスの2列のデータを取り出すことが可能です。
Admin SDKで取得する場合
概要
前述のGroupsAppでも良いのですが、200名の制限があるため、グループのメンバー取得に関してはAdmin SDKで取得するほうが色々と便利です。こちらのメソッドはGroupAppと違い以下の特徴があります。
- ドメイン単位で作成されてる全グループを一括で取得する事が可能
- pageTokenを回して全所属メンバーを取得する事が可能
- USERなのか?GROUPなのかを判定できるので異なるメソッドを使ってグループだけ処理をする必要がありません。
- 但し社外メンバーがグループに入ってる場合、そのメンバーはドメイン所属外となるのでリストに出てきません。
- Admin Consoleの管理者権限が無いと実行できない
- ユーザに与えられてるRole(権限)も取得することが可能です。
GroupsAppが1つのグループを処理するのに対して、こちらは一括で全グループをまとめて処理できるので大規模な処理に向いています。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
//Admin SDKでグループメンバーを取得する(子グループ以下も取得) function getGroupsMembers2(){ //取得対象のグループアドレス var groups = "ここにグループアドレスを入れる"; //取得対象ドメインの指定 var domain = "ここにドメインを入れる(例:hogehoge.co.jp)"; //書き出し用配列を用意する var array = getMemberlist2(domain,groups, "USER"); var grouparr = getMemberlist2(domain, groups, "GROUP"); //グループアドレスを走査する while(grouparr.length > 0){ //先頭のアドレスを一個取り出す var groupman = grouparr[0]; //所属メンバーを調べる var members = getMemberlist2(domain,groupman,"USER"); //メンバーをarrayに追加する array = mixarray(array, members); //子グループを調べる var tmpgroup = getMemberlist2(domain, groupman, "GROUP"); //ウェイトを入れる Utilities.sleep(1000); //先頭のグループアドレスを削除する grouparr.shift(); } //arrayの中身から重複アドレスを排除 let new_array = [...new Set(array.map(JSON.stringify))].map(JSON.parse); //スプレッドシートを取得 var prop = PropertiesService.getScriptProperties(); var ssid = prop.getProperty("sheetid"); var ss = SpreadsheetApp.openById(ssid).getSheetByName("member"); //シートをクリアする ss.getRange("A2:B").clearContent(); //シートに一括書き出し let lastColumn = new_array[0].length; //カラムの数を取得する let lastRow = new_array.length; //行の数を取得する ss.getRange(2,1,lastRow,lastColumn).setValues(new_array); return 0; } //Admin SDKでメンバーリストを取得する関数 function getMemberlist2(domain,groups,type){ //Admin SDK用変数 var pageToken, page; //配列を用意する var memberarr = []; //終了フラグ var endflg = false; //ループで全ユーザ情報を抜き取る do { //一旦全グループを取得する page = AdminDirectory.Groups.list({ domain: domain, maxResults: 500, pageToken: pageToken }); //グループ項目を取得する var groupman = page.groups; if (groupman) { //全グループからgroupsに一致するアドレスだけを処理する for (var i = 0; i < groupman.length; i++) { //グループを取り出す var tmpgroup = groupman[i]; //グループアドレスを取得する var grpaddress = tmpgroup.email; //グループアドレスが一致するかどうか? if(grpaddress == groups){ //メンバーを取得する var members = AdminDirectory.Members.list(grpaddress).members; //メンバー情報を取得して配列に追加する if (members){ //グループメンバーを取得して判定する for (var j = 0;j < members.length;j++){ //1名取り出す var tmpmember = members[j]; //ユーザかどうかを判定する(Activeのものだけ取り出す) if(tmpmember.type == type && tmpmember.status == "ACTIVE"){ if(type == "USER"){ //配列に追加する var temparr = [ groups, tmpmember.email ] memberarr.push(temparr) }else{ if(type == "GROUP"){ memberarr.push(tmpmember.email) } } } } }else{ console.log("メンバーがいない") } //ループ終了 endflg = true; break }else{ //一致しないのでスルーする } } //終了フラグが立っている場合は処理を終了 if(endflg){ break; } //次のページを取得する pageToken = page.nextPageToken; }else{ console.log("グループが存在しない"); } } while (pageToken); //メンバーデータを返す return memberarr; } |
- 呼び出されるgetMemberlist2関数の中で処理をしています。GroupsAppと違ってメンバーのタイプ(USERか?GROUPか?を判定できるので)で関数は1つで対応させています
- おおもとのgetGroupsMembers2関数はGroupsAppの時と大きく変更はありません。呼び出す関数は1個で引数がひとつ増えて、ドメインの指定が増えているだけです。
- ドメインはhogehoge.co.jpといったGoogle Workspaceで利用してるドメインを利用します。サブドメイン等ある場合は要注意。
- AdminDirectory.Groups.listでドメイン内全グループを取得し、AdminDirectory.Members.listでメンバーを取得します。
- メンバーデータのtypeでUSERか?GROUPかを判定できるので、そこで処理を分岐させています。
- 他、親グループにぶら下がる子グループについての再帰的な処理については前述のGroupsAppのケースと同じです。
- 存在しないグループアドレスを指定すると、「Resource Not Found: groupKey」を返し、ドメインを間違えてると「Not Authorized to access this resource/api」となるので要注意
ユーザが所属するグループアドレス一覧
逆に特定のユーザが直接所属するグループアドレスの一覧を取得したい場合があります。その場合もAdmin SDKにて取得させることが可能です。ただし、直接所属なので別のグループアドレスに子グループアドレスとして登録されていた場合、親グループアドレスには直接所属していないので、親のアドレスを取得するには色々と逆引きする処理が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//ユーザが直接所属するグループアドレス一覧 function getUserGroupList(){ //ユーザのメールアドレス var user = "ここに対象のメールアドレスを入れる"; //ドメインの指定 var domain = "ここにドメインを入れる"; //配列を用意 var grouparr = []; //所属グループ一覧を取得する var groupman = AdminDirectory.Groups.list({domain: domain, userKey: user}) //グループ取得 var group = groupman.groups; //グループアドレスを取り出す for (var i = 0; i < group.length; i++) { //グループを取り出す var tmpgroup = group[i]; //グループアドレスを取得する var grpaddress = tmpgroup.email; //配列に追加する grouparr.push(grpaddress) } //所属リストを返す return grouparr; } |
- AdminDirectory.Groups.listを利用してドメインとuserKeyにユーザのメアドを入れて実行します。
- tmpgroupにはグループアドレスが次々入ってくるのでこれを配列に入れて返しています。
全ドメインの自動取得
同じくAdminSDKを利用して、Google Workspaceに設定されているドメインの一覧というものも取得することが可能です。複数ドメインを割り当ててる場合には以下の関数を利用する事で、複数ドメインを一括で取得することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//GWSドメインを全取得 function getDomains() { //ログインユーザの情報にドメイン情報を全部取得する var mail = Session.getActiveUser().getEmail(); var user = AdminDirectory.Users.get(mail); var domains = AdminDirectory.Domains.list(user.customerId).domains; // ドメイン名のリストを配列化する var arr = []; for (var i = 0; i < domains.length; i++) { var domain = domains[i]; arr.push(domain.domainName); } //ドメイン一覧を返す return arr; } |
メンバーと社員マスターを結合する
前述まででMemberシートにメンバーのデータは取得できましたが、アドレスのみなので、このアドレスと別に用意してあるMasterシートのデータとをQuery関数で結合させ1つの完成したリストに仕立て上げます。これを自分の場合はウェブアプリの基準となるデータソースとして使っています。また、前述までの処理を自動的に毎晩行わせるためのトリガー処理を追加する事で、自動でMemberシートのメンテナンスも行わせメンテナンスフリーにする事で、少ない労力でアプリを維持する事が可能です。
Memberシートとemployeeシートをメールアドレスを持ってQuery関数で疑似外部結合したら、Masterシートに出力します。数式的には以下のような数式を入れておきます。
1 2 |
//Memberシートとemployeeシートをメアドで結合 =query({member!A2:B,iferror(arrayformula(vlookup(member!B2:B,employee!A2:D,{2,3,4},false)))},"select * order by Col3 Desc") |
employeeシートはメアド、名前、部署名、電話番号の4列で出来ており、Memberシートの2列分とvlookupさせる2列目の値、それをarrayformulaで結合させています。employeeシートの1列目はMemberシートでもってきてるので{2,3,4}とすることで、2列目以降のemployeeシートの3列分を結合させています。
外部結合なので、Memberシートの全員と合致するemployeeシート側のデータで結合させるので、Memberシートのデータは全部出てきます。
※arrayformula関数等の配列に対して3列目でソートをしてるため、通常はselect * order by C Descとなるところは、select * order by Col3 Descとしなければソートする事は出来ません。ここは要注意です。Col3で計算結果の3列目という意味になります。
カレンダーリソースを取得する
Googleカレンダーで会議のイベントを登録する場合によく利用する「リソース」。会議室や物品のレンタル等の数に限りのあるものを社内でやり取りする為の仕組みなのですが、このリソースの情報を都度取得しにいくのは非常に無駄が多い為(通常リソースの増減は殆ど起こりえない)、これらを一度取得して定期的に同期するようにし、アプリからはスプレッドシートのリソース情報を元に処理を行うようにすることで高速化することが可能です。
しかし、リソース情報はGroupsAppでは取得が出来ないので、Admin SDKを利用する必要性があります。カレンダーリソースおよびビルディングに関してはトリガーなどで自動取得は行わず手動で取得するようにしています(頻繁に内容が変わるものでは無いのと、自作アプリで表示非表示のチェックボックスを付けてるので変わると逆に困る)
カレンダーリソースの作成
カレンダーリソースはGoogle Workspaceの管理者がAdmin Consoleで事前に設定しておく必要性があります。設定手順は以下の通りです。
- Admin Consoleへログインする
- 左サイドバーからディレクトリ => ビルディングとリソース=>リソースの管理を開きます。
- すべてのビルディングに対してぶら下がる形でビルディング(拠点等)が列挙され、それぞれに所属するリソースが右側に出てきます。
上記に於いて、まずは拠点であるビルディングを組織部門(OU)のように作成します(下の方にあるビルディングを管理にて作成)。ビルディングIDを命名し名前やフロアを設定しておきます。
次に、各ビルディングにぶら下がる形で会議室1,2,3であったり、貸与する社用車やらサービスをぶら下げることでカレンダーリソースとして使えるようになります。それぞれにはカレンダーが用意されますので、リソースに対して付与されるメールアドレスでアクセスが可能です。
図:個別のリソースの情報
図:ビルディング情報作成中
リソース情報を取得する
まずは、現在用意されてるリソースの情報を取得し、スプレッドシートに書き出します。アプリで必要になる情報は主に以下の通りですが、こちらに取得できる情報の一覧があります。
- リソースの名前
- リソースのメールアドレス(カレンダーで利用します)
- リソースID(スクリプトで利用します)
- キャパシティ(部屋の人数等)
- リソースカテゴリ(リソースがどのようなものなのかの種別)
- ビルディングID(拠点となる場所のID)
となっています。但し、ビルディングIDに対するビルディング名は取得がこのメソッドでは取得ができません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
//リソースの一覧を取得する function getResourceInfo() { //現在実行してるユーザアドレスを取得する const user = GetUser(); //ユーザの情報に基づきカスタマIDを取得する const customerId = AdminDirectory.Users.get(user).customerId; let pageToken = ''; let array = []; //リソース情報を全部引っこ抜く do{ //カスタマIDをもってリソース情報をまとめて取得 let resources = AdminDirectory.Resources.Calendars.list(customerId, { pageToken: pageToken, maxResults:500 }); //itemを取り出す let items = resources.items; //取得した情報を元に配列を構成する for(let item of items){ //一時配列に配置する let temparr = [ item.resourceId, item.resourceName, item.resourceEmail, item.capacity, item.resourceCategory, item.buildingId, item.generatedResourceName true ] //arrayにpushする array.push(temparr) } //次のページトークンを取得する pageToken = resources.nextPageToken; }while(pageToken); //取得した情報をカテゴリ文字列を基準にソートする let new_array = array.sort((a, b) => { //カテゴリ列をソート if (a[4] > b[4]) return -1; if (a[4] < b[4]) return 1; //拠点列をソート if (a[5] > b[5]) return 1; if (a[5] < b[5]) return -1; return 0; }); //スプレッドシートを取得 var prop = PropertiesService.getScriptProperties(); var ssid = prop.getProperty("sheetid"); var ss = SpreadsheetApp.openById(ssid).getSheetByName("resource"); //シートをクリアする ss.getRange("A2:F").clearContent(); //シートに一括書き出し let lastColumn = new_array[0].length; //カラムの数を取得する let lastRow = new_array.length; //行の数を取得する ss.getRange(2,1,lastRow,lastColumn).setValues(new_array); return 0; } //現在のユーザのアドレスを取得 function GetUser() { var objUser = Session.getActiveUser(); return objUser.getEmail(); } |
- 実行するユーザはAdmin Consoleにログイン出来てアクセス権限を持ってるユーザになります。
- ユーザのメアドをもってcustomerIdを取得し、AdminDirectory.Resources.Calendars.listにてカレンダーリソースを一括で取得します。
- カレンダーリソースのitemsに入ってるデータをもとに配列を組んで、カテゴリ・拠点を元に昇順でソート(文字列)します。
- 最後に配列をスプレッドシートのresourceシートに一括で書き出します。
- temparrの最後は使用可否の項目として自分がスプレッドシートに設けたチェックボックスのオンオフを指定します。デフォルトでオンにするためにtrueとしています。
ビルディングを取得する
前述のカレンダーリソースを取得するメソッドでは所属するビルディングのIDは取得できるのですが、肝心のビルディングの名称は取得が出来ません。こちらについては、別途用意されているメソッドを使う事で取得できるので、合わせて利用する事で完璧なカレンダーリソースデータを取得することが可能です。
GAS内で連結しても良いですし、Query関数で連結して使うのも良いでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
//ビルディング情報を取得する function getBuildingInfo(){ //現在実行してるユーザアドレスを取得する const user = GetUser(); //ユーザの情報に基づきカスタマIDを取得する const customerId = AdminDirectory.Users.get(user).customerId; let pageToken = ''; let array = []; //ビルディング情報を全部引っこ抜く do{ //カスタマIDをもってリソース情報をまとめて取得 let buildman = AdminDirectory.Resources.Buildings.list(customerId, { pageToken: pageToken, maxResults:500 }); //itemを取り出す let items = buildman.buildings //取得した情報を元に配列を構成する for(let item of items){ //一時配列に配置する let temparr = [ item.buildingId, item.buildingName, true, ] //arrayにpushする array.push(temparr) } //次のページトークンを取得する pageToken = buildman.nextPageToken; }while(pageToken); //取得した情報をカテゴリ文字列を基準にソートする let new_array = array.sort((a, b) => { if (b[1] > a[1]) return -1; else if (b[1] < a[1]) return 1; else 0; }); //スプレッドシートを取得 var prop = PropertiesService.getScriptProperties(); var ssid = prop.getProperty("sheetid"); var ss = SpreadsheetApp.openById(ssid).getSheetByName("buildings"); //シートをクリアする ss.getRange("A2:C").clearContent(); //シートに一括書き出し let lastColumn = new_array[0].length; //カラムの数を取得する let lastRow = new_array.length; //行の数を取得する ss.getRange(2,1,lastRow,lastColumn).setValues(new_array); return 0; } |
- コード的には殆どリソースの取得と変わりません
- 今回はビルディングID、ビルディング名だけを取得し3列目は使用するかどうかとう列にしてるのでtrueだけをデフォルトで入れています。
- スプレッドシート上では使用可否はチェックボックスとしています。
- 今回はビルディング名でソートをするに当たって降順にしないとなぜか01.xxxとして命名したものが昇順的に並ばなかったので逆にしています。
- 取得したデータはbuildingsシートに一括で書き出ししています。
- 拠点IDを元に前述のデータと結合すると良いでしょう。
グループアドレス一覧を取得する
今回のスクリプトの元データになるグループアドレスの一覧をGoogle Workspaceのディレクトリからがっつりもってこようとすると2パターンありますが、基本的には管理者権限をもってAdmin SDKで取得するのがベターです。
GroupAppで取得する場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
//グループアドレス一覧を取得する(ユーザレベルでアクセスできるものだけ) function getAccessgroups(){ //グループを取得する var groups = GroupsApp.getGroups(); let array = [] //スプレッドシートのgrouparrを取得する let ssid = propman.getProp("sheetid"); let ss = SpreadsheetApp.openById(ssid).getSheetByName("grouparr"); let sheet = ss.getRange("A2:B").getValues() //ループで情報を取得 for (var i = 0; i < groups.length; i++) { var group = groups[i]; var email = group.getEmail(); var grpname = ""; //emailに合致するグループの名称を取得する for(var j = 0;j<sheet.length;j++){ //レコードを一個取り出す let rec = sheet[j]; //一致するかどうか? if(rec[0] == email){ grpname = rec[1]; break; } } //配列を用意する let temparr = [ grpname, email ] array.push(temparr) } return JSON.stringify(array); } |
- こちらは実行するユーザの権限で取得できる範囲のみ取得可能です(つまり自分が参加してるグループのみ)
- また、getNameというメソッドが無いためグループ名が取得できないので、あらかじめ用意してあるgrouparrのリストでグループアドレスに合致するものをみつけてグループ名を返すという仕組みにせざるを得ません。
- GroupApp.getGroupで取得し、getEmailでメアドを取得可能です
Admin SDKで取得する場合
特権管理者の権限で動作するので、基本すべてのグループアドレスを取得可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
//ドメインの指定 var domain = "hogehoge.co.jp"; //全グループの情報を取得する function getAllGroups(){ let admin = GetUser(); let ui = SpreadsheetApp.getUi(); if(admin == "特権管理者のアドレスを入力"){ //そのまま処理を続行する }else{ ui.alert("管理者権限でなければ実行できません"); return; } //API用変数 let pageToken; let array = []; do{ //アドレスリストを取得する try{ var groupList = AdminDirectory.Groups.list( { domain: domain, maxResults: 200, pageToken: pageToken } ); //グループ名とアドレスを取得する for(var i = 0;i<groupList.groups.length;i++){ //グループを取得する let group = groupList.groups[i]; //グループ情報を取得する let mail = group.email; let name = group.name; //配列に追加する let temparr = [ mail, name ] array.push(temparr) } }catch(e){ console.log(e.message) } //次のページトークンを取得する pageToken = groupList.nextPageToken; }while(pageToken) //アドレスの一覧を返す console.log(array) } |
- テナントのドメインを指定する必要があります。
- AdminDirectory.Groups.listにてドメインとpageTokenで200件ずつ取得して配列に追加していきます。
- こちらはグループ名も取得が可能なのでそのまま取得していきます。
- 次のページがある場合はnextPageTokenで取得して、次の200件を処理します。