[GAS] 毎週ファイルをコピーするスクリプト


# サンプルシナリオ

金曜日に公開予定のスライドがある。
毎週 `資料-2022-01-07` という名前でスライドを用意する。
毎週月曜日に先週のスライド (例: `資料-2022-01-07`) をコピーして次の金曜日の新しいスライド (例: `資料-2022-01-14`) を作成する。


# 方法

1. `資料-2022-01-07` を用意する。
1. ファイルコピースクリプトを作成する。
  1. コードをコピーする。
  1. トリガーを作成する。

## `資料-2022-01-07` を用意する。

最初のコピー元のファイルです。例は Google スライドですが、ほかファイルでも可能です。

## ファイルコピースクリプトを作成する。

ドライブの画面で新規作成を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/898de2fb-69d8-f24b-8ec7-925217abd0e7.png)

「その他」->「Google Apps Script」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/61636c6f-ddbf-8dfc-b2a2-d3478122952a.png)

以下のようなコード編集画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/6b309925-f69f-cf02-27a0-dee7644c0afe.png)

### コードをコピーする。

```js

function main()
{
  const FolderId = "[対象のファイルがある Google ドライブのフォルダ ID]";
  const SlideNameTemplate = "資料-%s";
  const FRIDAY = 5;
  // 次の資料名の日付
  const nextDate = getNextDayDate(FRIDAY);
  const nextDateString = Utilities.formatDate(nextDate, "Asia/Tokyo", "yyyy-MM-dd");
  // 前の資料名の日付
  const prevDate = new Date(nextDate)
  prevDate.setDate(prevDate.getDate() - 7);
  const prevDateString = Utilities.formatDate(prevDate, "Asia/Tokyo", "yyyy-MM-dd");

  const nextFileName = Utilities.formatString(SlideNameTemplate, nextDateString);
  const prevFileName = Utilities.formatString(SlideNameTemplate, prevDateString);

  let folder = DriveApp.getFolderById(FolderId);

  // 作成する予定のファイルがすでに存在するなら終了する。
  while (folder.getFilesByName(nextFileName).hasNext())
  {
    return;
  }

  let files = folder.getFilesByName(prevFileName);

  // コピー元のファイルが存在したら、コピーする。
  while (files.hasNext())
  {
    let prevFile = files.next();
    // コピー後のファイル名を指定する。
    prevFile.makeCopy(nextFileName);
    return;
  }
}

// 次の dayOfWeek (日:0 〜土: 6)曜日の日付を取得する。
function getNextDayDate(dayOfWeek)
{
  let nextDate = new Date();
  let days = dayOfWeek - nextDate.getDay()
  days = days <= 0 ? days + 7 : days;
  nextDate.setDate(nextDate.getDate() + days);
  return nextDate;
}
```

#### 曜日指定

```js
main 部分
  const FRIDAY = 5;
  const nextDate = getNextDayDate(FRIDAY);
...

// 次の dayOfWeek (日:0 〜土: 6)曜日の日付を取得する。
function getNextDayDate(dayOfWeek)
```

main 部分の FRIDAY は金曜日を表す数値を指定しています。プログラミング上、曜日を数値で表すことがあります。
getNextDayDate のコメントの通り曜日を表す数値は、日曜日は0,月曜日は1,というように進むごとに値が1ずつ増えていき、土曜日は6になります。

別の曜日にしたいときは FRIDAY 部分を変更します。

#### フォルダID

```js
  const FolderId = "[対象のファイルがある Google ドライブのフォルダ ID]";
```

フォルダIDとは、Googleドライブ上でのフォルダのIDです。URL から確認できます。
URLの `folders/` 以降の文字列です。もしクエリ文字列（`?`以降のURLパラメータ）がついていたらそれは含めません。

例: `https://drive.google.com/drive/folders/[フォルダ ID]`


### トリガーを追加する。

トリガーとは、自動で実行する仕組みです。
今回は月曜日のお昼に自動で実行してほしいです。
Apps Script の画面で設定できます。

左の時計アイコンのトリガーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/a3a7e247-b802-9310-c9ae-c4ccfc905271.png)

「トリガーを追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/05062a35-4e65-5a9f-9363-514867faa470.png)

以下のように指定します。
イベントのソースとは、どんな条件で自動実行するかの指定方法です。
今回の目的だと時間主導型の「週ベースのタイマー」で毎週を指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/5ff5e940-f96b-dae7-9cbe-27dc834bdb2a.png)

時刻は1時間の幅で指定できます。分単位まで指定したい場合、以下の記事を参考します。

https://tonari-it.com/gas-trigger-set/