ドライブアクティビティから、削除操作のみをメールで通知するGoogle Apps Scriptです。誤操作等でファイルが消されたことに早めに気付きたい時などに。
特にありません。GASの設置先としてスプレッドシートを使用しています。
このスクリプトは「Drive Activity API」を利用します。GASのエディタ画面、左側にある「サービス」から追加しておきましょう。
スクリプトの「事前設定エリア」を書き換えます。フォルダのURL、検索期間、レポートの送信先メールアドレスの3つです。
それぞれご自分の環境に合わせて入力をお願いします。
書き換えたら関数「onOpen」を一度実行して、必要な権限を承認します。
上のメニューにある「スクリプト実行」から「ファイルの削除操作をレポートする」を実行して、一度テストしてみましょう。
「削除ファイルレポート」という件名で、メールが届けば成功です。左から、削除日時、削除実行者のPeople ID、ファイル名、ファイルのタイプとなっています。
2番めのカラム(people/で始まるもの)には、削除操作を行った人のIDが入っています。People APIを使うことでメールアドレスに変換することが可能ですが、今回は割愛します。
もし届かない場合は、指定した期間内に削除操作が1件も無いかもしれません。
適当なファイルを削除してからもう一度実行してみてください。
動作確認に問題がなければトリガーを設定して定期的に実行しましょう。
サンプルコードではチェック期間を7日にしたので、毎週実行すれば良さそうです。
/**
* このスクリプトの説明、使い方はこちら。
* https://myfunc.jp/items/00107/index.html
*/
function onOpen() {
// スプレッドシートを開いたときに実行される関数
// UIの取得
const ui = SpreadsheetApp.getUi()
// メニューの表示名
const menu = ui.createMenu('スクリプト実行');
// メニューに追加するボタン
menu.addItem('ファイルの削除操作をレポートする', 'report_delete_activities');
// メニューを画面に追加する
menu.addToUi();
}
function report_delete_activities() {
// ############### 事前設定エリア ココから ###############
// 対象のGoogleドライブフォルダのURLを入力してください
const folder_url = 'https://drive.google.com/drive/folders/*******************';
// 削除操作をチェックしたい期間を指定してください。スクリプト実行時から指定した日付まで遡ってチェックします。
// トリガーの実行間隔と合わせることをおすすめします。
const term = 7;
// 削除操作のログを送信するメールアドレスを入力してください。
const mail_to = '*******************'
// ############### 事前設定エリア ココまで ###############
// アクティビティを検索する日付from toを指定
const date = new Date(); // 現在の日付を取得
const date_to = date.getTime(); // 時刻範囲のtoは現在日時のミリ秒
date.setDate(date.getDate() - term); // 事前設定で指定された日付だけ巻き戻す
const date_from = date.getTime(); // ミリ秒に直す
// 入力されたURLからIDを部分だけを取得する
const folder_id = folder_url.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 mimetype, file_title, actor, timestamp;
// delete操作であれば、必要な値を取得する
if (Object.keys(activity['actions'][0]['detail'])[0].match(/delete/)) {
// 「ファイルそのものに対する操作」と、「コメントの操作」でオブジェクトの構造が異なるため条件分岐する
if (activity['targets'][0]['driveItem']) {
// ファイルに対する操作を取得する
mimetype = activity['targets'][0]['driveItem']['mimeType']; // MIMETYPE
file_title = activity['targets'][0]['driveItem']['title']; // ファイル名
} else if (activity['targets'][0]['fileComment']) {
// コメントに関する各項目を取得する
mimetype = activity['targets'][0]['fileComment']['parent']['mimeType']; // MIMETYPE
file_title = activity['targets'][0]['fileComment']['parent']['title']; // ファイル名
}
actor = activity['actors'][0]['user']['knownUser']['personName']; // 操作を実行した人のID
} else {
// delete操作以外なら何もしない
continue;
}
// 操作が行われた日時をJSTに変換する。
timestamp = Utilities.formatDate(new Date(activity['timestamp']), 'JST', 'yyyy-MM-dd HH:mm:ss');
// 結果を格納する
result.push([timestamp, actor, file_title, mimetype]);
}
// 結果が1件以上あればメール送信する
if (result.length > 0) {
// メール件名を作成する
const mail_subject = '削除ファイルレポート ' + Utilities.formatDate(new Date(date_from), 'JST', 'yyyy/MM/dd') + '-' + Utilities.formatDate(new Date(date_to), 'JST', 'yyyy/MM/dd');
// メール本文を作成する
const mail_body = [];
for (let i = 0; i < result.length; i++) {
// 各項目をダブルクォーテーションで囲って連結する
mail_body.push('"' + result[i].join('","') + '"');
}
// メール送信処理
GmailApp.sendEmail(mail_to, mail_subject, mail_body.join('\n'));
}
}
Drive Activity APIを利用して、指定フォルダの操作ログを取得するGoogle Apps Scriptです。サボりの監視やセキュリティインシデント発生時の調査などにどうぞ。
指定したフォルダに入っているファイルの共有権限を、スプレッドシートに書き出すGoogle Apps Scriptです。権限の棚卸しをしたいときなどにどうぞ。
ファイルの共有権限を他のファイルと揃えてくれるGoogle Apps Scriptです。権限設定って結構めんどくさいですよね。