GASでGoogleグループを一括作成する

# 背景
現在所属している会社ではメーリングリストとしてGoogleグループを利用しているので、新規作成を手動ではなく自動で作成する仕組みを作り、作業負荷を減らそうと考えました。

# 手順
## スプレッドシートの準備
まずは新規でスプレッドシートを用意します。
以下の画像のようにスプレッドシートを構成してください。
<img width="655" alt="スクリーンショット 2019-03-22 14.17.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/146554/4444ff39-5513-6755-15f4-9565c3bf45fe.png">
項目名はわかりやすいものであれば、何でも大丈夫です。

そして、作成するメーリングリストのアドレスをA列に、名前をB列に入力します。
※C列には何も入力しないでください。実行後に自動的に日付が入力されます。
<img width="550" alt="スクリーンショット 2019-03-22 14.23.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/146554/3ffca41f-fec4-e90f-0408-153e8addee51.png">

## スクリプトの作成
スプレッドシートのメニューから［ツール］→［スクリプト エディタ］をクリックして、スクリプトエディタを起動します。エディタに以下のコードを貼り付けてください。

```Javascript
// メニューに表示させる
function onOpen(e){
    var arr = [
        {name: "Google Group作成", functionName: "createGroupBatch"}
    ];
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    spreadsheet.addMenu("スクリプト", arr);
}

// メイン処理
function createGroupBatch() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var lastcolum = sheet.getLastColumn();
  var lastrow = sheet.getLastRow();
  var startRow = 2;
  var numRows = lastrow - 1;
  var dataRange = sheet.getRange(startRow, 1, numRows, 3);
  var data = dataRange.getValues();
 
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    row.rowNumber = i + 2;
      //ステータス行に何も入っていなければ作成します。    
    if (!row[2]) {
      //現在日データ作成 (現在時刻）
      var today = new Date();
      //グループアカウントを作成します。
      CreateGroup(row[0],row[1]);
      //2重作成を防ぐためステータスを変更します。
      sheet.getRange(row.rowNumber, 3).setValue(today); 
    }  
  } 
}
 
// Group作成
function CreateGroup(groupID,name) {
  var res = AdminDirectory.Groups.insert({email:groupID,name:name});
  var group = AdminGroupsSettings.Groups.get(groupID);
  // メンバーはグループとして投稿出来ないようにする
  group.membersCanPostAsTheGroup = "false"; 
  // スパムフィルタリングを無効にする
  group.spamModerationLevel = "ALLOW";
  // ディレクトリにこのグループを表示する
  group.showInGroupDirectory = "true";
  // グループへのメッセージをアーカイブする
  group.isArchived = "true";
  // メンバーシップを見ることができる人に組織のすべてのメンバーを追加する
  group.whoCanViewMembership = "ALL_IN_DOMAIN_CAN_VIEW";
  return res.id;
}
```
コードは以下の記事を参考にしております。
http://www.mitori.co.jp/labo/archives/203

## 解説
```Javascript
// メニューに表示させる
function onOpen(e){
    var arr = [
        {name: "Google Group作成", functionName: "createGroupBatch"}
    ];
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    spreadsheet.addMenu("スクリプト", arr);
}
```
こちらの記述でスプレッドシート上からGASを実行出来るようにしています。スプレッドシートに表示されるタブの名前を”スクリプト”に、表示されるメニューを”Google Group作成”に設定しています。
![スクリーンショット 2019-03-26 10.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/146554/b6b94325-d336-9803-6c5b-7d507fa0e688.png)

```Javascript
// メイン処理
function createGroupBatch() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var lastcolum = sheet.getLastColumn();
  var lastrow = sheet.getLastRow();
  var startRow = 2;
  var numRows = lastrow - 1;
  var dataRange = sheet.getRange(startRow, 1, numRows, 3);
  var data = dataRange.getValues();
 
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    row.rowNumber = i + 2;
      //作成日に何も入っていないかを確認    
    if (!row[2]) {
      //現在時刻の確認
      var today = new Date();
      //グループアカウント作成
      CreateGroup(row[0],row[1]);
      //2重作成を防ぐためステータスを変更
      sheet.getRange(row.rowNumber, 3).setValue(today); 
    }  
  } 
}
```
スプレッドシートに記載されているグループアカウントを作成します。
作成日に何も入っていない場合、作成するアドレスに記述されているグループアカウントを作成します。作成後に２重作成を防ぐために実行日を作成日の欄に記入します。

```Javascript
// Group作成
function CreateGroup(groupID,name) {
  var res = AdminDirectory.Groups.insert({email:groupID,name:name});
  var group = AdminGroupsSettings.Groups.get(groupID);
  // メンバーはグループとして投稿出来ないようにする
  group.membersCanPostAsTheGroup = "false"; 
  // スパムフィルタリングを無効にする
  group.spamModerationLevel = "ALLOW";
  // ディレクトリにこのグループを表示する
  group.showInGroupDirectory = "true";
  // グループへのメッセージをアーカイブする
  group.isArchived = "true";
  // メンバーシップを見ることができる人に組織のすべてのメンバーを追加する
  group.whoCanViewMembership = "ALL_IN_DOMAIN_CAN_VIEW";
  return res.id;
}
```
グループアカウントを作成する関数になります。
AdminDirectory.Groups.insertでグループアカウントを作成し、作成したグループアカウントの設定を変更しています。こちらは以下のリファレンスを参考に適宜修正してください。

https://developers.google.com/admin-sdk/groups-settings/v1/reference/groups/update