ヘッダー画像

「Googleサイト」最近更新されたファイルガジェットをどうにかしたい

はじめに

皆様従来のGoogleサイトから新しいGoogleサイトへの移行は進んでいるでしょうか?これを機に他のサービスへの移行を検討されている会社様も多数いらっしゃるとは思いますが、グループウェアを変更するのは容易ではありません。今回の記事では従来のGoogleサイトで利用できていた最近更新されたファイルガジェットをどうにか再現する方法がないかを記載していきます。

最近更新されたファイルガジェットとは?

従来のGoogleサイトでは、標準機能の中でいくつかのガジェットが用意されていました。最近更新されたファイルガジェットはファイルキャビネット上のファイルのうち新しいものを指定した件数表示させる機能を持つガジェットになります。ポータルのトップページなどに表示している場合が多い機能ですね。

最近更新されたファイルガジェット

今回実装する機能

既存のガジェットと同じ機能が提供できるのが理想ではありますが、現実問題としてそうはいきません。まず大本であるファイル置き場のファイルキャビネットの移行先はGoogleサービスの中ではGoogle Drive以外に選択肢がないと考えております。つまりGoogleドライブ上のファイルの更新日付を拾うことにより完全に同じではないにしろ同様の機能を提供します。今回はGoogle Apps Scriptを使って実装してみたいと思います。Google Apps Scriptはメーカーサポートがついていませんので何かトラブルが起きても自己責任ということになりますのでご理解いただいたうえで実装をお願いいたします。

フォルダIDの確認方法

今回のプログラムでは指定したフォルダ内のファイルをチェックすることになります。プログラム上で対象のフォルを指定する必要があります。フォルダIDは以下の形で取得してください。

対象のフォルダを開いてURLのfolders/の後ろにある文字列をコピーします。

Google Drive フォルダID

変数名rootFolderの値にペーストします。合わせてrecipentの値に宛先メールアドレスを指定します。

変数名
rootFolder対象となるフォルダのIDを記載
recipent宛先のメールアドレスを記載

どのタイミングで実行するの?

前日の値を取りに行きます。厳密には前日の0時からスクリプトが実行された時間までを取ってくるような形にしてあります。不都合ある方はご自身で修正してみてくださいね。Google Apps Scriptには実行タイミングをタスク指定することができますのでその機能を利用して毎日午前0時~午前1時の間でスクリプトを実行させるようにしてみます。スクリプトエディタ画面左にある時計マークをクリックすることでトリガー作成画面に遷移できます。[新しいトリガー]をクリックしていただくことで下記の画面が表示されます。

Google Apps Script トリガー指定

実行する関数を選択には、トリガー起動されたときに呼び出しするメソッドを選択します。今回の例ではmainですね。あとは毎日午前0時に実行させたいのですが、なぜがピンポイント指定できない仕様なのでいったん午前0時~午前1時にしておきます。

ソースコード

実際のソースコードは下記の通りになります。1日前しか見ないように作っていますが2行目の-1を増やしてもらえれば3日前とか1週間前とか取りに行くことが可能です。めんどくさかったのでグローバル変数使ってますが気になる方は修正してくださいね。

var nowDate = new Date();
var yday = Utilities.formatDate(new Date(nowDate.getFullYear(),nowDate.getMonth(),nowDate.getDate() -1), "JST", "yyyy年MM月dd日 HH:mm:ss");
var messeage ="<html><head></head><body><h2>昨日更新のあったファイルは以下の通りです。</h2><table border=1><tr><th>ファイル名</th><th>更新日</th>";
var i = 0;

function main(){
  var rootFolder = "<フォルダID>";
  getLastUpdatedOnGoogleDriveFilesAndFolders(rootFolder);
  messeage += "</table></body></html>";
  
  //対象が一件もなければメールしない
  if (i > 0){
    sendMail(messeage);
  }
  
}

//メール送信ファンクション
function sendMail(body){
  var sdf = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd');
  //送信先アドレス指定
  const recipient ="<メールアドレス>";
  //メールタイトル指定
  const subject ="ファイル更新通知_" + sdf;

  GmailApp.sendEmail(
    recipient, 
    subject, 
    "HTMLメールが表示できませんでした。",
    {
    htmlBody: body,
    name: "ファイル更新更新通知"
    });
}

//Googleドライブ上のフォルダ/ファイルの最終更新日時を取得するコード
function getLastUpdatedOnGoogleDriveFilesAndFolders(strfolder) {
  var myRootFolder = DriveApp.getFolderById(strfolder);
  var files = myRootFolder.getFiles();
  var folders = myRootFolder.getFolders();

  //ファイルをチェック
  while (files.hasNext()) {
    var file = files.next();
    var name = file.getName();
    var lastUpdatedDate = Utilities.formatDate(file.getLastUpdated(), "JST", "yyyy年MM月dd日 HH:mm:ss");
    
    //前日更新のあったファイルのみを抽出
    if(lastUpdatedDate > yday){
      messeage += "<tr><td><a href=" + file.getUrl() + ">" + name + "</a></td><td>" + lastUpdatedDate + "</td></tr>";
      i += 1
    }
  }

  //フォルダをチェック
  while (folders.hasNext()) {
    var folder = folders.next();
    getLastUpdatedOnGoogleDriveFilesAndFolders(folder.getId());
  }
}

これで前日の更新されたファイルを取得することができるかと思います。HTML形式のメールに表で送信されるように調整してあります。また、ファイル数が膨大の場合うまく動かない可能性がございますので、ご認識の上実行してください。HTMLメールが受け取れない環境の場合もファイルリストは届かない仕様にしてあります。

実行結果

まとめ

今回はGoogle Apps Scriptを使ってGoogle Drive上の更新ファイルを取得してメール通知する方法をご紹介しました。リアルタイムトリガーが出来ればSpreadsheetに情報を書き出して、GoogleサイトにSpreadsheetを張り付けておくことで最近更新されたファイルガジェットの代用にもなるかもしれないなと思ってみたもののリアルタイム性を求めるのもプログラム回し続けないといけないことから今回の仕様となりました。リアルタイムな通知とはいきませんが一定の代用案としてご利用いただけるのではと考えております。その他Googleサイトのカスタマイズについて別記事に記載してありますので合わせてご確認ください。本記事が皆様のサイト移行、利活用の一助となりましたら幸いです。