【GAS】フォルダの日付管理を自動化する方法

プログラミング言語

フォルダを年や月に分けて管理している方も多いのではないでしょうか。私は会社の議事録を日付に対応して管理しています。2022年10月16日であれば「2022年フォルダ」の「10月フォルダ」に追加することで議事録も迷子になりません。

しかし、その度に議事録をフォルダに移動させるのはめんどう。作成すると同時に追加したいフォルダにあれば便利ですよね。

今回はフォルダを日付管理している方必見のGASコードを紹介します!

完成形:年/月に対応したフォルダに議事録を置く

今日は「2022年10月16日(日曜日)」
今日に対応したフォルダにドキュメントを追加するなら、
Workフォルダ(親)の中に今年(2022年)のフォルダがあり、その配下の今月(10月)のフォルダに議事録が配置されていると良さそう。ドキュメント名は作成した日付が分かるように「日付_議事録」としました。

こんなふうに管理できるようにコードを書いていきましょう!

はじめに

今回はスタンドアロンスクリプトでコードを書きます。

「Google ドライブの新規」→「その他」→「Google Apps Script」を選択して立ち上げます。

コード

書いてみたコードはこんな感じ。

コピペOK!(ところどころ修正は必要です)

function createDocument() {
  // ①親フォルダを取得する
  var workFolder = DriveApp.getFolderById('xxxxx');
 
  // ②日付を整形する
  var formatDate = Utilities.formatDate(new Date(), "JST","yyyy/MM/dd");
  var year = formatDate.substring(0, formatDate.indexOf('/'));
  var thisYear = year + "年";
  var month = formatDate.substring(5, 7);
  var thisMonth = month + "月";
  var monthAndDate = formatDate.substring(formatDate.indexOf('/') + 1);
 
  // ③ドキュメントを作成する
  var doc = DocumentApp.create(monthAndDate + '_議事録');
  var docFile = DriveApp.getFileById(doc.getId());
 
  // ④月と日に対応したフォルダを作成しドキュメントを配置する
  var folders = workFolder.searchFolders(`title contains '${thisYear}'`);
  if (folders.hasNext()) {
    var thisYearFolder = folders.next();
    var monthFolders = thisYearFolder.searchFolders(`title contains '${thisMonth}'`);
    if (monthFolders.hasNext()) {
      var thisMonthFolder = monthFolders.next();
      thisMonthFolder.addFile(docFile);
    } else {
      var nextMonthFolder = thisYearFolder.createFolder(thisMonth);
      nextMonthFolder.addFile(docFile);
    }
  } else {
    var nextYearFolder = workFolder.createFolder(thisYear);
    var thisMonthFolder = nextYearFolder.createFolder(thisMonth);
    thisMonthFolder.addFile(docFile);
  }
}

コードの解説

① 親フォルダの取得

var workFolder = DriveApp.getFolderById('xxxxx');

年フォルダを配置するための親フォルダを決めます。ここでは「Workフォルダ」と命名。

‘xxxxx’ には「Workフォルダ」の id を代入してください。(画像の赤字部分)

② 日付の整形

var formatDate = Utilities.formatDate(new Date(), "JST","yyyy/MM/dd");

ドキュメントやフォルダの命名に使いやすいように日付を整形しておきましょう。

例えば、2022年10月16日であれば、2022/10/16と表示されます。

var year = formatDate.substring(0, formatDate.indexOf('/'));
var thisYear = year + "年";
var month = formatDate.substring(5, 7);
var thisMonth = month + "月";
var monthAndDate = formatDate.substring(formatDate.indexOf('/') + 1);

thisYear と thisMonth はフォルダ名に使うため変数に切り出しておきます。

議事録に今日の日付を付けるために monthAndDate の変数を作成しましたが、ここらへんはお好きなようにどうぞ。

③ ドキュメントを作成する

var doc = DocumentApp.create(monthAndDate + '_議事録');
var docFile = DriveApp.getFileById(doc.getId());

ドキュメントを新規作成する。

後ほどフォルダに追加するためドキュメントのIDを変数に代入しておきます。

④ 月と日に対応したフォルダを作成しドキュメントを配置する

var folders = workFolder.searchFolders(`title contains '${thisYear}'`);
if (folders.hasNext()) {

searchFolders()

Work フォルダから今年の名前がついたフォルダを取得する。

hasNext()

フォルダがあれば true を返し、なければ false を返す。

var thisYearFolder = folders.next();
var monthFolders = thisYearFolder.searchFolders(`title contains '${thisMonth}'`);

すでに今年のフォルダが作成されている場合

next()

今年のフォルダにあるフォルダを取得する。

searchFolders()

今年のフォルダから今月の名前がついたフォルダを取得する。

if (monthFolders.hasNext()) {
  var thisMonthFolder = monthFolders.next();
  thisMonthFolder.addFile(docFile);

今月のフォルダがすでに存在する場合は新規作成したドキュメントを追加します。

} else {
  var nextMonthFolder = thisYearFolder.createFolder(thisMonth);
  nextMonthFolder.addFile(docFile);

今月のフォルダが存在しない場合は新しく今月のフォルダを作成し、ドキュメントを追加します。

} else {
    var nextYearFolder = workFolder.createFolder(thisYear);
    var thisMonthFolder = nextYearFolder.createFolder(thisMonth);
    thisMonthFolder.addFile(docFile);
  }
}

今年のフォルダが存在しない場合は新しく今年のフォルダと今月のフォルダを作成し、ドキュメントを追加します。

まとめ

フォルダ日付管理の自動化いかがだったでしょうか。

会議前などにタイマーをセットしておくと自動で作成されて便利です!もちろん当日以外に作成することも可能で、その場合は日付周辺の処理変更をお忘れなく。

hasNext() や next() など普段見慣れないメソッドもいくつか使っていたので、詳しい使い方は Google Apps Script をご覧ください。

仕事に役立つプログラミング紹介でした!

参考文献

Class FolderIterator  |  Apps Script  |  Google for Developers