Drive Activity APIを利用して、指定フォルダの操作ログを取得するGoogle Apps Scriptです。サボりの監視やセキュリティインシデント発生時の調査などにどうぞ。
特にありません。GASの設置および出力先としてスプレッドシートを使用します。
上のメニューにある「スクリプト実行」から「指定フォルダの操作ログを取得する」を実行します。
ログを取得したいフォルダのURLを入力してください。
Googleドライブを開いたときに、アドレスバーに表示される「https://drive.google.com/drive/folders/」で始まるURLです。
すこし待つと、「シートNを作成し、アクティビティログを出力しました!」と完了メッセージが表示されます。
書き出されたデータを見てみます。
下記項目が出力されます。
「実行者」が謎のIDで出力されますが、People APIを使うことでメールアドレスや名前に変換することが可能です。
/**
* このスクリプトの説明、使い方はこちら。
* https://myfunc.jp/items/00094/index.html
*/
function onOpen() {
// スプレッドシートを開いたときに実行される関数
// UIの取得
const ui = SpreadsheetApp.getUi()
// メニューの表示名
const menu = ui.createMenu('スクリプト実行');
// メニューに追加するボタン
menu.addItem('指定フォルダの操作ログを取得する', 'get_activities');
// メニューを画面に追加する
menu.addToUi();
}
function get_activities() {
// ############### 事前設定エリア ココから ###############
// アクティビティの取得期間を指定します。年月日時分秒の順番で指定してください。
// ただし「月」は0〜11で表現しますので、実際の月より-1した値を入力してください。
const date_from = new Date(2022, 4, 20, 0, 0, 0).getTime();
const date_to = new Date(2022, 4, 30, 23, 59, 59).getTime();
// ############### 事前設定エリア ココまで ###############
// 画面にアラートを表示するためにUIオブジェクトを取得
const ui = SpreadsheetApp.getUi();
// 実行の確認メッセージを表示する
const prompt = ui.prompt('アクティビティを出力したいフォルダのURLを入力してください', '例:https://drive.google.com/drive/folders/******************', ui.ButtonSet.OK_CANCEL);
// キャンセルが押されたらスクリプトを終了する
if (prompt.getResponseText() == ui.Button.CANCEL) {
return;
}
// 入力されたURLからIDを部分だけを取得する
const folder_id = prompt.getResponseText().match(/^.*folders\/(.*)/)[1];
// 検索条件を指定する
const request = {
ancestor_name: 'items/' + folder_id, // 検索する場所の指定
pageSize: 1000, // 取得件数を指定(最大1000件らしい?)
filter: 'time >= ' + date_from + ' time <= ' + date_to // 取得する期間を指定
};
// アクティビティを取得
const response = DriveActivity.Activity.query(request);
const activities = response['activities'];
// シートに書き込むデータを格納する配列
const result = [];
// アクティビティ1件ずつ、必要なデータだけ取得する
for (let i = 0; i < activities.length; i++) {
// 見やすくするため、入れ直す
let activity = activities[i];
// 変数を定義
let action, mimetype, file_id, file_title, actor, timestamp;
// 「ファイルそのものに対する操作」と、「コメントの操作」でオブジェクトの構造が異なるため条件分岐する
if (typeof activity['targets'][0]['driveItem'] === 'undefined') {
// コメントに関する各項目を取得する
mimetype = activity['targets'][0]['fileComment']['parent']['mimeType']; // MIMETYPE
file_id = activity['targets'][0]['fileComment']['parent']['name']; // ファイルのID
file_title = activity['targets'][0]['fileComment']['parent']['title']; // ファイル名
} else {
// ファイルに対する操作を取得する
mimetype = activity['targets'][0]['driveItem']['mimeType']; // MIMETYPE
file_id = activity['targets'][0]['driveItem']['name']; // ファイルのID
file_title = activity['targets'][0]['driveItem']['title']; // ファイル名
}
action = activity['actions'][0]['detail']; // アクティビティの種類(editやrenameなど)
actor = activity['actors'][0]['user']['knownUser']['personName']; // 操作を実行した人のID
// 操作が行われた日時を取得。JSTに変換する。
timestamp = Utilities.formatDate(new Date(activity['timestamp']), 'JST', 'yyyy-MM-dd HH:mm:ss');
// シート書き込み用の配列に追加する
result.push([timestamp, actor, action, file_title, mimetype, file_id]);
}
// アクティブなスプレッドシートオブジェクトを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 書き込み用のシートを追加する
const sheet = ss.insertSheet();
// 項目名を追加する
result.unshift(['日時', '実行者', 'アクション', 'ファイル名', 'MIMETYPE', 'ファイルID']);
// 結果の配列を元に、書き込み範囲を取得する
const range = sheet.getRange(1, 1, result.length, result[0].length);
// シートへ書き込み
range.setValues(result);
// 完了メッセージを表示
ui.alert(sheet.getName() + 'を作成し、アクティビティログを出力しました!')
}
指定したフォルダに入っているファイルの共有権限を、スプレッドシートに書き出すGoogle Apps Scriptです。権限の棚卸しをしたいときなどにどうぞ。
ドライブアクティビティから、削除操作のみをメールで通知するGoogle Apps Scriptです。誤操作等でファイルが消されたことに早めに気付きたい時などに。
ファイルの共有権限を他のファイルと揃えてくれるGoogle Apps Scriptです。権限設定って結構めんどくさいですよね。
シートに記載したファイルURLを元に、親フォルダの名前とURLを出力するGoogle Apps Scriptです。
Googleドライブ上でファイル名が重複しているものを探すGoogle Apps Scriptです。同じ名前のファイルに苦しめられている方、いかがですか?