😸
GASでGoogleドライブ監査ログを自動抽出(まとめ)
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)
}
]
}
]
}
]
}
],
わかってないこと
- アクティビティとは(取得対象のアプリケーションの認識)
- 次のページ(次のトークン)とは何を指しているのか、社内全体のドライブが複数あり、それを次々に取得するから次のページと言っている認識で良いか
- Gドライブチェックの各抽出条件は
_reformParameters
で絞るで良いか
Discussion