見出し画像

いつファイルが編集されたの!?自動チェック&メールを送ろう📨 / Google ドライブ

今回は、Google ドライブ のフォルダを指定して、その中にファイルが編集されたら、自動で通知したり、編集日時を記録していくシステムになっています!!

GoogleWorkspace for Education を導入が進み、「共同編集」という言葉も、だいぶ聞き慣れてきましたよね!

いつ編集されているのか、いつの間に編集されていた!
という経験もあるのではないでしょうか。

共同編集かつ自動保存は便利です!
でも一方で、誰がいつ編集しているのかとか、通知があったら嬉しくないですか??

編集があったかどうかのチェックだけなら、トリガーとメール送信の機能だけで良いのですが、フォルダ内のファイル全てを適用させるのは大変だし。

たくさんメールくるし。

そこで、Google ドライブ のあるフォルダを指定して

そのフォルダに入っている Google ドキュメント 、Google スライド 、Google スプレッドシート 、Google Forms などのファイルが編集されれば

その編集された日時を自動でメールを送るというツールです!!

どうですか!?

こちらもコピペをしながら作ってみましょう!

[1] Google スプレッドシート の準備

↓からスプレッドシートを新規作成してください!

[2] シートの準備

まず、A1 のセルに、

フォルダID

と入力しましょう。

プログラムを実行していくときには、B1 のセルに、指定するフォルダのIDを入れていきます。

次に、カラム名の設定です。
(2行目に入れるあたり、個人的にはとても気持ち悪いんですけど…。)

作成 , 日時 , 編集日時 , フォルダ名 , URL , ID , MimeType , 共有設定 , 編集者 , 閲覧者

としてください。
こんな感じ。

[3] スクリプトの準備

「拡張機能」「AppsScript」をクリックしてください。

ここに下記のスクリプトをコピペしましょう!

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('取得メニュー', [
      {name: 'フォルダのファイル一覧', functionName: 'driveFile'},
      {name: 'ファイル編集チェック', functionName: 'driveFileCheck'},
      {name: 'クリア', functionName: 'delRows'},
    ]);
}

function delRows() {
  //スクリプトに紐づいたスプレッドシートのアクティブなシートを読み込み
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('ファイル一覧');
  //clearContentメソッドで複数行を削除
  var lastRow = sheet.getLastRow();
  var ui = SpreadsheetApp.getUi();
  var res = ui.alert('警告','このシートをクリアしていいですか?',ui.ButtonSet.YES_NO);
  if(res == ui.Button.YES){
  sheet.getRange(3,1,lastRow,9).clearContent();
  sheet.getRange(1,2).clearContent();
  }
}

function driveFile(){
// Google ドライブを取得する
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

// シートを取得する
var sheet = spreadsheet.getSheetByName('ファイル一覧');

// シートからデータを取得する
var folderId = sheet.getRange(1,2).getValue();

// Google ドライブのフォルダを取得する
var folder = DriveApp.getFolderById(folderId);

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";

var files = folder.searchFiles(query);

// ファイルの一覧を出力する
while (files.hasNext()){
  var file = files.next();
  var editors= file.getEditors();
  var viewers = file.getViewers();
  var editor = [];
  var viewer = [];
  // 共有されているユーザーの一覧を出力する
  
  for (var i = 0; i < editors.length; i++) {
   editor.push(editors[i].getEmail());
    }
  for (var i = 0; i < viewers.length; i++) {
   viewer.push(viewers[i].getEmail());
    }
  sheet.appendRow([file.getDateCreated(),file.getLastUpdated(),file.getName(),file.getUrl(),file.getId(),file.getMimeType(),file.getSharingAccess(),editor.join(),viewer.join()]);
}
}

function driveFileCheck(){
// Google ドライブを取得する
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

// シートを取得する
var sheet = spreadsheet.getSheetByName('ファイル一覧');

// シートからデータを取得する
var folderId = sheet.getRange(1,2).getValue();

// Google ドライブのフォルダを取得する
var folder = DriveApp.getFolderById(folderId);

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";

var files = folder.searchFiles(query);

var beforeData = sheet.getDataRange().getValues();

var To = '';//ここにアドレスを入れてください
var Subject = '編集されたファイルがあります。';//こちらはメールの件名になります。
var Body = '';

// ファイルの一覧を出力する
while (files.hasNext()){
  var file = files.next();
  var id = file.getId();
  var afterDate = file.getLastUpdated();

  // 値が見つかるまで繰り返す
    for (var i = 0; i < beforeData.length; i++) {
  // 配列の中で検索する
      var index = beforeData[i].indexOf(id);
      if (index >= 0) {
  // 値が見つかった場合
        var check = afterDate - beforeData[i][1];
        if(check != 0){
          Body += file.getName() + ' は編集されました。\n\n' 
                + '編集日時:' + file.getLastUpdated() 
                +'\nURL:' + file.getUrl() 
                + '\n\n------------------\n\n';
          sheet.getRange(i+1,2).setValue(afterDate);
        }
      } 
    }
  }
  if(Body != '')
  GmailApp.sendEmail(To,Subject,Body);
}

大きなブロックごとで見ていきましょう。

まずは、メニューを作るところ。
記事を見ていただいている方はもうおなじみですね!

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('取得メニュー', [
      {name: 'フォルダのファイル一覧', functionName: 'driveFile'},
      {name: 'ファイル編集チェック', functionName: 'driveFileCheck'},
      {name: 'クリア', functionName: 'delRows'},
    ]);
}

次に、削除の処理です。

function delRows() {
  //スクリプトに紐づいたスプレッドシートのアクティブなシートを読み込み
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('ファイル一覧');
  //clearContentメソッドで複数行を削除
  var lastRow = sheet.getLastRow();
  var ui = SpreadsheetApp.getUi();
  var res = ui.alert('警告','このシートをクリアしていいですか?',ui.ButtonSet.YES_NO);
  if(res == ui.Button.YES){
  sheet.getRange(3,1,lastRow,9).clearContent();
  sheet.getRange(1,2).clearContent();
  }
}

次に Google ドライブ を取得するところです。

function driveFile(){
// Google ドライブを取得する
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

// シートを取得する
var sheet = spreadsheet.getSheetByName('ファイル一覧');

// シートからデータを取得する
var folderId = sheet.getRange(1,2).getValue();

// Google ドライブのフォルダを取得する
var folder = DriveApp.getFolderById(folderId);

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";

var files = folder.searchFiles(query);

// ファイルの一覧を出力する
while (files.hasNext()){
  var file = files.next();
  var editors= file.getEditors();
  var viewers = file.getViewers();
  var editor = [];
  var viewer = [];
  // 共有されているユーザーの一覧を出力する
  
  for (var i = 0; i < editors.length; i++) {
   editor.push(editors[i].getEmail());
    }
  for (var i = 0; i < viewers.length; i++) {
   viewer.push(viewers[i].getEmail());
    }
  sheet.appendRow([file.getDateCreated(),file.getLastUpdated(),file.getName(),file.getUrl(),file.getId(),file.getMimeType(),file.getSharingAccess(),editor.join(),viewer.join()]);
}
}

こちらは、下記の記事で解説しているところです!

基本的には、上記の記事で書いているところに、下記のスクリプトを追加しています。

function driveFileCheck(){
// Google ドライブを取得する
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

// シートを取得する
var sheet = spreadsheet.getSheetByName('ファイル一覧');

// シートからデータを取得する
var folderId = sheet.getRange(1,2).getValue();

// Google ドライブのフォルダを取得する
var folder = DriveApp.getFolderById(folderId);

// 自分がオーナーのファイルを検索する
var query = "'me' in owners and trashed = false";

var files = folder.searchFiles(query);

var beforeData = sheet.getDataRange().getValues();

var To = '';//ここにアドレスを入れてください
var Subject = '編集されたファイルがあります。';//こちらはメールの件名になります。
var Body = '';

// ファイルの一覧を出力する
while (files.hasNext()){
  var file = files.next();
  var id = file.getId();
  var afterDate = file.getLastUpdated();

  // 値が見つかるまで繰り返す
    for (var i = 0; i < beforeData.length; i++) {
  // 配列の中で検索する
      var index = beforeData[i].indexOf(id);
      if (index >= 0) {
  // 値が見つかった場合
        var check = afterDate - beforeData[i][1];
        if(check != 0){
          Body += file.getName() + ' は編集されました。\n\n' 
                + '編集日時:' + file.getLastUpdated() 
                +'\nURL:' + file.getUrl() 
                + '\n\n------------------\n\n';
          sheet.getRange(i+1,2).setValue(afterDate);
        }
      } 
    }
  }
  if(Body != '')
  GmailApp.sendEmail(To,Subject,Body);
}

この編集のチェックをしているのは、下記の部分になります。

// ファイルの一覧を出力する
while (files.hasNext()){
  var file = files.next();
  var id = file.getId();
  var afterDate = file.getLastUpdated();

  // 値が見つかるまで繰り返す
    for (var i = 0; i < beforeData.length; i++) {
  // 配列の中で検索する
      var index = beforeData[i].indexOf(id);
      if (index >= 0) {
  // 値が見つかった場合
        var check = afterDate - beforeData[i][1];
        if(check != 0){
          Body += file.getName() + ' は編集されました。\n\n' 
                + '編集日時:' + file.getLastUpdated() 
                +'\nURL:' + file.getUrl() 
                + '\n\n------------------\n\n';
          sheet.getRange(i+1,2).setValue(afterDate);
        }
      } 
    }
  }

既に取得しているファイルの変更日時と、改めて編集日時を取得して、違いがあるかどうかを判定しています。

違いがあれば(編集されていれば)、この後メールを送るときの本文に当たるところに編集された旨を入れています。

ここですね!

  // 値が見つかった場合
        var check = afterDate - beforeData[i][1];
        if(check != 0){
          Body += file.getName() + ' は編集されました。\n\n' 
                + '編集日時:' + file.getLastUpdated() 
                +'\nURL:' + file.getUrl() 
                + '\n\n------------------\n\n';
          sheet.getRange(i+1,2).setValue(afterDate);
        }

そして、編集されたファイルが一つでもあれば、メール本文が入っているので、

  if(Body != '')
  GmailApp.sendEmail(To,Subject,Body);

上記のようにして、本文が入っていれば、メールを送るようにしています。

最後に、メールを送る相手を設定しましょう。

var To = '';//ここにアドレスを入れてください

'  '  の中に、メールアドレスを入力しましょう。

それでは、動作するか確かめてみましょう!

[4] 実行

💾(保存)⇨▶️(実行)をクリックしてください。

権限の承認をしてください。

[5] 取得したいフォルダのIDの準備

フォルダのIDは、画像を保存してある Google ドライブ のフォルダを開いた時のURLからコピーします。

↑の上部にあります。(隠してあるところです)

https://drive.google.com//drive/folders/フォルダのID

このIDをコピーして、B1 のセルに貼り付けてください!

これで準備完了です!

[6] 本当に実行します。

まずは、フォルダ一覧の取得をしましょう!

IDが出ているところは隠しています。

テストをしてみたいので、なんでもいいので、取得できたファイルを編集してみてください。

1分でも違いがあれば大丈夫です。

編集してみたら、ファイル編集チェックをクリックしてみます。

メールがきます!

今回は、2つ編集したので、その分メールの本文が追加されていますね!

いらなくなったら、クリアをして削除してください。

さて、このチェックは、手動でやってもいいし。

トリガーを設定してもいいと思います。

[7] トリガーの設定

左側の ⏰(トリガー)をクリック

右下にある「+トリガーを追加」をクリック

「実行する関数を選択」から、driveFileCheck にして、

「イベントのソースを選択」から、「時間主導型」をクリック、

最後に、どれくらいの間隔でファイルのチェックを行いたいかを設定します。

この感覚があまりにも短いと、ファイルを編集中、ずっとメールが届くことになってしまうので、せめて1時間以上にすることをお勧めします。

そして、「保存」をクリックします。

これで「トリガー」がセットされました。

1時間おきに設定したので、1時間ごとにファイルに編集があるかどうかがチェックされて、編集日時に違いがあればメールが届きます!

是非お試しください!!

問い合わせ先

info@itoksk.com

Twitter

Facebook

ポートフォリオ


YouTube チャンネル

いちばんやさしい Google Apps Script


何かと0から1を作るのは大変だと思います。学校はどこも似たような問題課題に対応していると思います。それなのに、先生って自分だけで頑張ろうとするんですよね。ボクの資料やnoteが1になって、学校ごとの現状に合わせてカスタムしていただければと思います‼️