2022/06/21に更新

【GASで監視】削除されたファイルを通知する

ドライブ

ドライブアクティビティから、削除操作のみをメールで通知するGoogle Apps Scriptです。誤操作等でファイルが消されたことに早めに気付きたい時などに。

こんな悩みを解決します


  • 誰かがファイルを消している気がする・・・!消されたらすぐ知りたい!

用意するもの


特にありません。GASの設置先としてスプレッドシートを使用しています。

このスクリプトで出来ること


  • 指定したGoogleドライブのアクティビティログから、削除操作だけをメールでレポートすることが出来ます。

使い方


1.事前準備

このスクリプトは「Drive Activity API」を利用します。GASのエディタ画面、左側にある「サービス」から追加しておきましょう。

スクリプトの「事前設定エリア」を書き換えます。フォルダのURL、検索期間、レポートの送信先メールアドレスの3つです。
それぞれご自分の環境に合わせて入力をお願いします。
書き換えたら関数「onOpen」を一度実行して、必要な権限を承認します。

2.テスト実行

上のメニューにある「スクリプト実行」から「ファイルの削除操作をレポートする」を実行して、一度テストしてみましょう。

「削除ファイルレポート」という件名で、メールが届けば成功です。左から、削除日時、削除実行者のPeople ID、ファイル名、ファイルのタイプとなっています。
2番めのカラム(people/で始まるもの)には、削除操作を行った人のIDが入っています。People APIを使うことでメールアドレスに変換することが可能ですが、今回は割愛します。

もし届かない場合は、指定した期間内に削除操作が1件も無いかもしれません。
適当なファイルを削除してからもう一度実行してみてください。

3.トリガーの設定

動作確認に問題がなければトリガーを設定して定期的に実行しましょう。
サンプルコードではチェック期間を7日にしたので、毎週実行すれば良さそうです。

  • 実行する関数: report_delete_activities
  • デプロイ時に実行: HEAD
  • イベントのソースを選択: 時間主導型
  • 時間ベースのトリガーのタイプ: 週ベースのタイマー
  • 曜日を選択: 月曜日
  • 時刻を選択: 0〜1時

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * 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'));

  }
}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp