3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-12

はじめに

こんにちは。ももクロの走れを久々に聴いて、あー好きだわ。と思いました、筆者です: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

表示しているスライドのslide_object_idはURLから取得可能です.

slide_id.png

element_object_idはDevToolsから取得可能です.

a.png

valueは別シートでプラグイン等で月次集計しているGoogleAlyticsの値を使ってます.

※Qiitaのこの記事上ではべた書きします:pray:

2. アーカイブ用フォルダ作成

作成後のドライブはこんな感じです↓
a.png

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

3. スクリプトエディタ起動

今回は以下のように、スプレッドシートに紐づくスクリプトとしてGASを書いていこうと思います。

slide3.png

4. GASを書きます

ちまちま書いてもあれなので、一気に書きます:pray:

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

6. 動作確認

スライドが更新されました!
媒体資料_202106-Google-スライド.png

また、資料はアーカイブフォルダに移動しました!
1.png

7. トリガーセット

毎月自動で更新したいので、以下のようにトリガーセットします。
無題のプロジェクト-プロジェクトのトリガー-Apps-Script.png

これで完了!

おわりに

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

それでは!

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?