最高権限のスクリプト

佐野

佐野 2013年4月16日

ついにはGoogleAppsスクリプトで、
グループの操作まで可能にしてしまいました。

グループの操作方法に関しては、ネット上のどこにも掲載されていないため、
もしかすると、今のところウチだけ・・・?

ともかく、無料アカウントでは不可能なスクリプトなので、
GoogleAppsを研究するような企業や代理店でなければ、
これを発見するのは、まず不可能ではないでしょうか。

まず、「var groups = GroupsManager.getAllGroups();」
この関数と代入により、「groups」という変数に、グループが配列として代入されます。
つまり、「groups[0]」とすれば、最初のグループを指定、
「groups[0].getId()」で、そのグループのメールアドレスが取得でき、
「groups[0].getName()」で、そのグループの名前(日本語で入力した名前など)
が取得できるという仕組みです。

さらに「var groupMembers = groups[0].getAllMembers()」で、
そのグループのメンバーのメールアドレス(文字列)を
配列で取得する事が可能となります。

他にも、グループの管理者のメールアドレスを取得したり、
グループメンバーや管理者の権限を操作、
そして、グループ自体を作成・削除する関数もあります。
その辺りは、ぜひコード補完を見て調べてみてください(ちょっと投げやり気味ですが…)。

というわけで、とりあえずグループ一覧を
スプレッドシートに並べるスクリプトを掲載します。
残念ながら、無料アカウントでは、これを使用する事はできませんが。

function groupAndMemberGet() {
  
  var groups = GroupsManager.getAllGroups();
  
  var mailAddresss = new Array();
  for(var i = 0;i < groups.length;i ++){
    var groupMembers = groups[i].getAllMembers();
    for(var j = 0;j < groupMembers.length;j ++){
      if(mailAddresss.length <= 0){
        mailAddresss.push(groupMembers[j]);
      }else{
        var inItem = true;
        for(var k = 0;k < mailAddresss.length;k ++){
          if(mailAddresss[k] == groupMembers[j]){inItem = false;}
        }
        if(inItem){mailAddresss.push(groupMembers[j]);}
      }
    }
  }
  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sSheet.getActiveSheet();
  
  var test1 = sheet.getMaxRows();
  var test2 = groups.length;
  
  if(sheet.getMaxColumns() - 2 < groups.length){
    var plus = groups.length - sheet.getMaxColumns();
    sheet.insertColumns(sheet.getMaxColumns(),plus + 2);
  }
  
  if(sheet.getMaxRows() - 1 < mailAddresss.length){
    var plus = mailAddresss.length - sheet.getMaxRows();
    sheet.insertRows(sheet.getMaxRows(),plus + 1);
  }
  var sheetData = sheet.getRange(1,1,sheet.getMaxRows(),sheet.getMaxColumns()).getValues();
  
  //シートデータ配列を白紙化
  for(var i = 0;i < sheetData.length;i ++){
    for(var j = 0;j < sheetData[i].length;j ++){
      sheetData[i][j] = "";
    }
  }
  
  for(var i = 0;i < groups.length;i ++){
    sheetData[0][i + 1] = groups[i].getId();
    sheetData[1][i + 1] = groups[i].getName();
  }
  for(var i = 0;i < mailAddresss.length;i ++){
    sheetData[i + 2][0] = mailAddresss[i];
  }
  
  sheet.getRange(1,1,sheet.getMaxRows(),sheet.getMaxColumns()).setValues(sheetData);
  sheet.setFrozenRows(2);
  sheet.setFrozenColumns(1);
  sheet.getRange(1,1,2,sheet.getMaxColumns()).setBackgroundRGB(239, 239, 239).setHorizontalAlignment("center");
  sheet.getRange(1,1,sheet.getMaxRows(),1).setBackgroundRGB(239, 239, 239);
}

function groupDataGet(){
  
  var groups = GroupsManager.getAllGroups();
  var sSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = sSheet.getActiveSheet();
  var sheetData = sheet.getRange(1,1,sheet.getMaxRows(),sheet.getMaxColumns()).getValues();
  
  //シートデータ配列を白紙化(左上端を除く)
  for(var i = 2;i < sheetData.length;i ++){
    for(var j = 1;j < sheetData[i].length;j ++){
      sheetData[i][j] = "";
    }
  }
  
  var checkMach = "○";
  
  for(var i = 0;i < groups.length;i ++){
    for(var j = 1;j < sheetData[0].length;j ++){
      if(sheetData[0][j] == groups[i].getId()){
        var groupMembers = groups[i].getAllMembers();
        
        for(var k = 2;k < sheetData.length;k ++){
          for(var l = 0;l < groupMembers.length;l ++){
            if(sheetData[k][0] == groupMembers[l]){
              sheetData[k][j] = checkMach;
            }
          }
        }
      }
    }
  }
  sheet.getRange(1,1,sheet.getMaxRows(),sheet.getMaxColumns()).setValues(sheetData);
  sheet.getRange(3,2,sheet.getMaxRows(),sheet.getMaxColumns()).setHorizontalAlignment("center");
}

まだまだ無駄の多いスクリプトとは思いますが、
列や行が足りなければ追加したり、セルの配色や固定なども行って、
見やすくなるようには工夫したつもりです。

しかしグループといえば、
それ自体を別目的のメールアドレスにも使用でき、
多数のアカウントが配属しているとなれば、
その操作は、より慎重でなければなりません。

取得するだけなら、まだ気軽に行える部分ですが、
メンバーを追加・離脱させたりする操作などは、
自動で容赦なく動くスクリプトならば、大きな混乱を生じかねません。
まずは別途テスト用のグループを作成し、そこでテストを行った上で、
より計画的に動作させるのが良いでしょう。

そしてもうひとつ注意点があります。
グループの取得、メンバーの取得は、数が多いほどその動作は重くなっていき、
おそらく100人ほど利用しているドメインなら、
もしかしたら処理に時間がかかり、
許容時間を超え、スクリプトが停止するかもしれません。
これはグループ操作に限った話ではなく、
例えばドライブ上で新規ファイルを作成する作業や、
別途スプレッドシートにアクセスする作業などを
ループで何度も繰り返す動作を行うと、スクリプトは停止します。

なので、グループを取得、ユーザーを取得、グループを設定といった
一連の作業を一括で全て行うのではなく、
それらを分割して行う事も考えたほうがいいかもしれません。
むしろ手動でそれらの操作を行っていくようにする事で、
責任の伴う動作を、より慎重に行うキッカケにもなるはずです。

実は言うと、このグループ操作が可能になる関数を発見したキッカケは、
自分自身のアカウントのメールアドレスを取得する方法を探していたときです。

スプレッドシートに、追加のメニューを作成して動作させると、
動作させたアカウントがスクリプトを動かす事になるので、
そのアカウントのメールアドレスを取得したいと思ったからです。

最初は意外とその関数が見つからず、ドライブ上にファイルを作成して、
その管理者(作成者である自分)のメールアドレスを取得するという、
原始的な方法を考えていました。
そこで、もっといい方法はないかと、
デバッグモードで出る「this」という物を調べてみて、
偶然グループを作成する方法を発見しました。

「this」を見ると、グループ以外にも、
ドメイン内のユーザーもある程度操作できそうですし、
どうやら、ユーザーのパスワードの変更さえも可能となりそうです
(取得は不可能ですが)。
もちろん、自分のメールアドレスを取得する方法も別に見つけましたが、
ここまで色々と見つかると、管理ツールとしての可能性も見出せそうです。