はじめに
業務で社内・社外のマニュアルをパワーポイントで作成し、
Google Driveで保存・共有をしています。
マニュアルの管理がなされておらず、
最新版がどれなのか、一目ではわからない状態でした。
そのため、マニュアル内の、商標や問い合わせ先を修正した際、
いつ時点のファイルには更新されているのか、
一つ一つファイルを開けるのが大変でした。
なので今回、GASで指定のフォルダ内のファイル名、URL、最終更新日を取得して、
以下を達成しようと試みました。
- 最終更新日を取得することで修正対象のファイルを把握
- 修正対応後、再度GASを実行→最終更新日の再取得で「対応済みかどうか」の確認
今回工夫したポイント
・ファイルの最終更新日時の取得
・GASを実行した日時を残す
・ファイル一覧を最新状態にしたいので、前に作成した一覧は一度クリアにする
(前回GAS実行時より、ファイル数が減っていると、古いファイル一覧が一部残ってしまうため)
コードの流れ~ファイル一覧の取得準備~
1.日付を取得する
//現在の日付を取得する
var date = new Date();
var dateStr = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd HH:mm:ss');
日付だけではなく、時間も記録したいため'yyyy-MM-dd HH:mm:ss'
で、日付の表示形式を変更しました
2.ファイル一覧を作成したいスプレッドシートを取得する
3.シート内の値をクリアにする
4.取得対象のフォルダをIDを変数に入れる
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート名');
sheet.clearContents();
const folderId = 'フォルダID';
フォルダIDはURLから確認できます。
'https://drive.google.com/drive/u/1/folders/{フォルダID}'
4.ファイル一覧データを格納する'list(array)
'を用意する
5.書き出す'row'
,'colum'
を指定しておいてあげる
// ファイル一覧データを入れるリストを用意(後ほど、ここにデータを格納します)
var list = [];
// スタートのrowとcolumを指定する
var rowIndex = 1;
var colIndex = 1;
コードの流れ~ファイル一覧を取得して、スプレッドシートに貼り付ける~
6.ファイル名、ファイルURL、最終更新日を取得する
7.予め用意してあった'list(array)'
に格納してあげる
// フォルダIDを指定して、ファイル(複数)を取得する
var folder = DriveApp.getFolderById(folderId);
var files = folder.getFiles();
while(files.hasNext()){
var buff = files.next();
var fileName = buff.getName();
var fileUrl = buff.getUrl();
var lastUpdateDate = Utilities.formatDate(buff.getLastUpdated(),'JST', 'yyyy-MM-dd HH:mm:ss');
// 取得したfileName,file,lastUpdateDateを追加する
list.push([fileName,fileUrl,lastUpdateDate]);
}
8.格納したarrayを登録した順にするため、順序を逆にする
9.格納したarrayをスプレッドシートに貼り付ける(手順5で指定していたrow,columを使用)
// listの順序を並び替える
list.reverse();
// 一覧を貼り付けたい場所を取得する
var ranges = sheet.getRange(rowIndex, colIndex, list.length, list[0].length);
// 取得した場所に、一覧を貼り付ける
ranges.setValues(list);
10.貼り付けたリストの一番下のrangeを取得して、日付を貼り付ける
// A列の値を取得
var aValues = sheet.getRange('A:A').getValues();
// A列で値がはいっているrowを取得する
var lastRow = aValues.filter(String).length;
// 日付を入れたい箇所=lastRowにプラス1をする
var dateRow = lastRow + 1;
var rangeDate = sheet.getRange(dateRow,1);
// 手順1で設定した日付を貼り付ける
rangeDate.setValue(dateStr);
GAS実行後のスプレッドシート
A列にファイル名、B列にファイルURL、C列に最終更新日が取得できました。
まとめと今後の課題
・よかった点
これまで、値を取得して、スプレッドシートに貼り付ける際、一つ一つループを回す→一つ一つ貼り付けるといったコードを書いていましたが、ファイル名等の取得する際に、一度リストにしてしまってから貼り付ける方法を知り、書くコードが一部短くすることができました。
他にも、最終更新日を確認でき、修正が必要なファイルを確認することができました。
・今後の課題
ただ、複数フォルダに複数ファイルが散在するので1フォルダにまとめないと、このGASは実行できない難点もあるなと感じました。複数フォルダ間の操作も、今後トライしてみたいと思います。
加えて、トリガーの設定(ファイル編集時か起動時、または時限式か?など)も検討していきたいです。
今回参考にさせていただいた記事
▼Google Drive上の指定のフォルダ以下のファイル一覧をSpreadSheetに書き出す
https://qiita.com/akiko-pusu/items/43c89dcfeb1d544cce38
▼【コピペで使える】GASでフォルダ/ファイルの最終更新日時を取得してみる
https://for-dummies.net/gas-noobs/how-to-get-updated-date-of-folders-and-files-on-google-drive/#1