😸

GASでGoogleドライブ監査ログを自動抽出(まとめ)

2021/07/21に公開

pageTokenが取得ができなくなるまで(指定したstartTime〜endTimeまでの)社内全てのドライブのリストを取得し、指定のシートに抽出する

function myFunction() {
  // 変数定義
  let pageToken;
  let now = new Date();
  let yesterday = new Date(now.getTime() - 1 * 24 * 60 * 60 * 1000); 
  let startTime = yesterday.toISOString();
  let endTime = now.toISOString();

  let events = [];
  
  // pageTokenが取得ができなくなるまで(指定したstartTime〜endTimeまでの)社内全てのドライブのリストを取得し、指定のシートに抽出する
  do {
    let page;
    // pageTokenが取得ができなくなるまで(指定したstartTime〜endTimeまでの)社内全てのドライブのリストを取得
    page = AdminReports.Activities.list("all", "drive", { 
      pageToken:pageToken,
      startTime:startTime,
      endTime:endTime,
      maxResults:1000
    });
    pageToken = page.nextPageToken;

    if (!page.items) return;

    page.items.forEach(function (item) {
      // events(レポート内のアクティビティイベント(各項目))をレコード取得して連想配列で回す
      item.events.forEach(function (event) {
        //console.log(event);
        let prm = _reformParameters(event.parameters);
	// 出力したいパラメータを「events配列」に配列にセット
        events.push([
          event.name,event.type,
          prm.doc_id,prm.doc_type,prm.doc_title,prm.visibility,prm.actor_is_collaborator_account,
          prm.owner,prm.owner_is_shared_drive,prm.owner_is_team_drive
        ]);
      });
    });
  } while (pageToken);

  
  let itemPutSheetObj = _getItemPutSheetObj();
  // Rangeオブジェクト.clear():指定セル範囲を全てクリア
  itemPutSheetObj.getRange("A2:Z").clear();
  // セルを範囲で取得(getRange(row, column [, numrows [, numcolumns]])し、「events配列」をセットする)
  itemPutSheetObj.getRange(2,1,events.length,10).setValues(events);
}

_getItemPutSheetObj

getSheetByNameでシート名でシートを取得

function _getItemPutSheetObj(){
  return SpreadsheetApp.getActiveSpreadsheet().getSheetByName("出力");
}

_reformParameters

パラメータのオブジェクト生成

function _reformParameters(prms){
  let obj = new Object();
  prms.forEach(function(prm){    
    if (!prm.name) return;    
    switch(prm.name){
      case "primary_event":
        obj.primary_event = prm.boolValue;
        break;
      case "billable":
        obj.billable = prm.boolValue;
        break;
      case "doc_id":
        obj.doc_id = prm.value;
        break;
      case "doc_type":
        obj.doc_type = prm.value;
        break;
      case "is_encrypted":
        obj.is_encrypted = prm.boolValue;
        break;
      case "doc_title":
        obj.doc_title = prm.value;
        break;
      case "visibility":
        obj.visibility = prm.value;
        break;
      case "actor_is_collaborator_account":
        obj.actor_is_collaborator_account = prm.boolValue;
        break;
      case "owner":
        obj.owner = prm.value;
        break;
      case "owner_is_shared_drive":
        obj.owner_is_shared_drive = prm.boolValue;
        break;
      case "owner_is_team_drive":
        obj.owner_is_team_drive = prm.boolValue;
        break;
    }
  });
  return obj;
}

event.parameters

let prm = _reformParameters(event.parameters);
  "events": [
    {
      "type": string,
      "name": string,
      "parameters": [
        {
          "messageValue": {
            "parameter": [ // ここ
              {
                object (NestedParameter)
              }
            ]
          },
          "name": string,
          "value": string,
          "multiValue": [
            string
          ],
          "intValue": string,
          "multiIntValue": [
            string
          ],
          "boolValue": boolean,
          "multiMessageValue": [
            {
              "parameter": [
                {
                  object (NestedParameter)
                }
              ]
            }
          ]
        }
      ]
    }
  ],

https://developers.google.com/admin-sdk/reports/reference/rest/v1/activities/list#ApplicationName

わかってないこと

  • アクティビティとは(取得対象のアプリケーションの認識)
  • 次のページ(次のトークン)とは何を指しているのか、社内全体のドライブが複数あり、それを次々に取得するから次のページと言っている認識で良いか
  • Gドライブチェックの各抽出条件は_reformParametersで絞るで良いか

Discussion