GoogleスライドをGASで毎月自動更新する

# はじめに
こんにちは。ももクロの**走れ**を久々に聴いて、あー好きだわ。と思いました、筆者です:bow:

さて、今回は、自社の媒体資料を毎月**手動**で値更新していたので、自動化しましたので記事にしました。
参考になれば幸いです。

# 前提
媒体資料の制約というか仕様みたいなものがあります。

1. **Googleスライド**で管理している.
2. 資料内の値に**GoogleAlytics**の値が含まれている.
3. 資料内の値に**GoogleSearchConsole**の値が含まれている.
4. 資料は毎月更新したい.
5. 古い資料はアーカイブフォルダに移動したい.

# 方針
1. Googleスプレッドシートで更新対象の値を管理する.
2. 1の値は自動で更新されるようにしておく.
3. アーカイブフォルダを作成しておく.
4. 毎月3日に作成処理を行う.
   1. GoogleAlytics、GoogleSearchConsoleのデータが溜まるのを待つため.

# 実装
## 1. 更新値管理スプレッドシート作成.
必要な値は以下の3つです.

1. slide_object_id: スライド識別する一意のID
2. element_object_id: スライド内の要素を識別する一意のID
3. value: 更新値

| No. | slide_object_id | element_object_id | value |
|:-:|:-:|:-:|:-:|
| 1 | gdf91911947_0_0 | gdf91911947_0_1 | タイトル(更新済み) |
| 2 | gdf91911947_0_0 | gdf91911947_0_2 | 説明文(更新済み) |

スプレッドシートのスクショだとこんな感じです↓
![slide1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/f223ad6d-2f7e-07db-ae27-912fddfc0086.png)


### 表示しているスライドの`slide_object_id`はURLから取得可能です.
![slide_id.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/69847540-0480-5367-803a-b6b32568d12c.png)

### `element_object_id`はDevToolsから取得可能です.
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/5183fd28-f070-18bd-725a-416db99d66cf.png)


### `value`は別シートでプラグイン等で月次集計しているGoogleAlyticsの値を使ってます.
※Qiitaのこの記事上ではべた書きします:pray:

## 2. アーカイブ用フォルダ作成
作成後のドライブはこんな感じです↓
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/eda98d9d-b31d-4853-8fde-11ceb949ecd6.png)

このとき、フォルダIDを控えておいて下さい。

http://amehal.blogspot.com/2015/10/id.html

## 3. スクリプトエディタ起動
今回は以下のように、スプレッドシートに紐づくスクリプトとしてGASを書いていこうと思います。

![slide3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/9b8017b8-7070-b994-3d39-b8661714eca2.png)

## 4. GASを書きます
ちまちま書いてもあれなので、一気に書きます:pray:

```js
const main = () => {
  const google_drive_folder_id = 'xxxx';
  const google_drive_folder_id_archive = 'yyyy'
  const base_file_name = '媒体資料_'
  const date = new Date()

  // yyyymm
  const date_last_month_yyyymm = Utilities.formatDate(new Date(date.getFullYear(), date.getMonth() - 1, 1), 'JST', 'yyyyMM')
  const date_this_month_yyyymm = Utilities.formatDate(date, 'JST', 'yyyyMM')

  // file name
  const file_name_old = base_file_name + date_last_month_yyyymm
  const file_name_new = base_file_name + date_this_month_yyyymm
  const slide_new = DriveApp.getFolderById(google_drive_folder_id).getFilesByName(file_name_new);

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  const data = sheet.getRange('A2:D' + sheet.getLastRow()).getValues();

  if (! slide_new.hasNext()) {
    // 生成対象月のスライドが無ければ前月スライドをコピーして作成.
    const slides_original = DriveApp.getFolderById(google_drive_folder_id).getFilesByName(file_name_old);
    if (! slides_original.hasNext()) {
      return false;
    }

    const slide_original = slides_original.next()
    var new_presentation_id = slide_original.makeCopy(file_name_new).getId()

    // 古いslideをアーカイブフォルダに移動.
    slide_original.moveTo(DriveApp.getFolderById(google_drive_folder_id_archive))
  } else {
    var new_presentation_id = slide_new.next().getId();
  }

  // 値更新
  let slide, element;
  for (var i in data) {
    slide = SlidesApp.openById(new_presentation_id).getSlideById(data[i][1]);
    element = slide.getPageElementById(data[i][2]);
    element.asShape().getText().setText(data[i][3]);
  }
}
```

## 5. スクリプト実行
スクリプト実行には以下権限が必要になるので、初回起動時のダイアログに従って許可してください:pray:

![Desktop-screenshot (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/ccf41807-aa9f-2919-42c8-2adaf5542d83.png)

## 6. 動作確認
スライドが更新されました！
![媒体資料_202106-Google-スライド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/b50d3052-81b1-e1ca-e66a-1d5b5884034a.png)

また、資料はアーカイブフォルダに移動しました！
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/d99e4aaf-28b7-e325-2b1b-8c9b7e110dab.png)

## 7. トリガーセット
毎月自動で更新したいので、以下のようにトリガーセットします。
![無題のプロジェクト-プロジェクトのトリガー-Apps-Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/7f0757c9-76e2-138e-1e3c-f5a35faa1ab7.png)

これで完了！

# おわりに
駆け足になりましたが、GoogleスライドをGASで更新する流れでした！
今回は文字しか更新していませんが、画像なども更新できますよ:+1:

それでは！