Google 簡報: 建立簡報 create()

 



老實說,大多數簡報不是難在內容,而是難在「流程很碎」:建檔、命名、插封面、貼要點、歸檔……每件事都不難,但累積起來很花時間。

SlidesApp.create() 就像幫你準備好舞台的按鈕,一按就生出一份新的簡報,ID、網址、第一張投影片通通就緒。這篇會從觀念開始,示範最小可動範例(幾行程式就能跑)、如何追加版型與文字方塊、怎麼插入圖片,以及建立後把檔案搬進專案資料夾。

中途也會提醒你常見的雷:授權範圍選太大、配額被打爆、或是把範本需求硬塞在空白建立流程上。目標很單純——把繁瑣變成按流程跑的自動化,讓你每次開會前不再手忙腳亂。希望本篇文章能夠幫助到需要的您。


目錄

{tocify} $title={目錄} 


為什麼要用程式建立簡報?

手動開簡報沒什麼難度,但一旦你每週要對老闆、客戶、或班級產出固定版型(週報、銷售報告、課件、例會),自動化才是真省時。把範本、資料來源、生成邏輯固定下來,下一次就能一鍵生成,不再來回複製貼上。

兩條路:SlidesApp(內建服務)vs Slides API(進階服務)

SlidesApp(內建 Apps Script 服務)

走的是「最少設定、快速上手」路線;建立檔案只要一行:SlidesApp.create('你的檔名'),回傳 Presentation 物件,接著你可以加投影片、文字、圖片等。方法清單裡明確列出 create(name),回傳型別為 Presentation(可立即編輯)。

Slides API(進階服務 / REST)

如果你要批次請求、或需要 REST 能力(例如和非 Apps Script 的系統整合),可啟用「Slides 進階服務」或直接走 Google Slides API 的 presentations.create。官方指南也提供多語言範例。

本文主軸放在 SlidesApp.create()。


SlidesApp.create() 到底做了什麼?

方法簽名與回傳:SlidesApp.create(name) 會建立並開啟一個新的 Google 簡報,回傳 Presentation。你可以接著 .getSlides()、.appendSlide()、或操作形狀與文字。

建立位置:用 Apps Script 建立的檔案,預設會放在你的雲端硬碟根目錄(或與腳本有關聯的預設空間);若你想放進特定資料夾,需要後續再「移動」檔案(細節見後文)。官方也在 Slides API 指南明白說明:建立的簡報預設存到根目錄;要放資料夾,得用 Drive API 搬運或直接用 Drive API 在目標資料夾建立檔案。

授權範圍(Scopes):多數情境下 Apps Script 會自動偵測所需的 OAuth Scopes,你也能在 appsscript.json 顯式設定。原則是不多要權限。

配額(Quotas):Apps Script 對各服務有每日配額;簡報的「建立/新增」也在限制內。官方配額頁會列出「Presentations created / Slides created」等數量級(依帳戶型態不同)。


先備知識:權限與配額一分鐘總表

授權:第一次執行會跳出同意畫面。Apps Script 會自動判斷需要的 Scopes,也可在 manifest 顯式指定最小權限。

配額:

        每日可建立的簡報與投影片數量有上限(以「Presentations created」「Slides created」為準)。

        若你還會用到 Drive API 搬檔、或 URLFetch 拉圖像等,記得那些服務也有額外的次數/流量限制。

心法:若你有大批量產需求,把任務分批、加上睡眠(Utilities.sleep())、避免在尖峰時段狂打 API,是基本功。


超完整操作步驟(從零開始)

以下用 Google Apps Script(基於 V8) 示範。你可以在任何 Google 文件、試算表、或直接到 [script.google.com] 建立「獨立專案」。


步驟 1:建立 Apps Script 專案

1.    到雲端硬碟 → 新增 → 更多 → Google Apps Script(或在簡報/試算表中:擴充功能 → Apps Script)。

2.    取一個好記的專案名稱,例:AutoSlides – 每週報告產生器。

第一次跑會跳授權畫面,照說明授權即可(Apps Script 會自動判斷所需範圍)。


步驟 2:最小可動版(Minimal Working Example)

function createDeck() {
  const title = `週報_${new Date().toISOString().slice(0,10)}`;
  const pres = SlidesApp.create(title); // 建立並回傳 Presentation
  Logger.log('Created presentation: %s (url=%s)', pres.getId(), pres.getUrl());
}


上面這段就是核心的一行:SlidesApp.create(title)。官方文件明確說 create(name) 會回傳 Presentation,可立即操作。


步驟 3:建立後加內容(投影片、標題、重點條列)

function createDeckAndFill() {
  const pres = SlidesApp.create('行銷週報 – 自動產生');
  const slide = pres.appendSlide(SlidesApp.PredefinedLayout.TITLE_AND_BODY);
  slide.getPageElements().forEach(el => {
    // 找到標題與內文 placeholder,分別填字
    if (el.asShape) {
      const shape = el.asShape();
      const ph = shape.getPlaceholder();
      if (!ph) return;
      const type = ph.getType(); // TITLE / BODY 等
      if (type === SlidesApp.PlaceholderType.TITLE) {
        shape.getText().setText('本週亮點');
      } else if (type === SlidesApp.PlaceholderType.BODY) {
        shape.getText().setText('• 成長關鍵字:\n• 活動轉換:\n• 下週實驗:');
      }
    }
  });
  Logger.log('Done: %s', pres.getUrl());
}


小提醒:PredefinedLayout 與 PlaceholderType 都在 Slides 服務列舉中,能幫你快速定位元件。


步驟 4:插入圖片 / 圖表

若你要插入外部圖片(URL),得先下載(UrlFetchApp.fetch)再轉成 blob;配額與擋住跨網域的情況要注意。URLFetch 也有每日上限。

function insertCoverImage(presId, imgUrl) {
  const res = UrlFetchApp.fetch(imgUrl);
  const blob = res.getBlob().setName('cover.jpg');
  const pres = SlidesApp.openById(presId);
  const first = pres.getSlides()[0];
  first.insertImage(blob).setWidth(800).setLeft(80).setTop(100);
}


步驟 5:把新檔案移到指定資料夾

SlidesApp.create() 建立的簡報預設在根目錄;若要放進特定資料夾,有兩種做法(官方 Slides API 指南有白紙黑字寫明):

        1.    建立後用 Drive API 的 files.update 移動;或

        2.    直接用 Drive API 的 files.create 在資料夾底下建,MIME 為 application/vnd.google-apps.presentation。兩者都需要合適的 Drive API scopes。

在 Apps Script 裡,若只需簡單移動、DriveApp 也能處理(不必開進階服務):

function moveToFolder(presId, folderId) {
  const file = DriveApp.getFileById(presId);
  const folder = DriveApp.getFolderById(folderId);
  folder.addFile(file);
  const parents = file.getParents();
  while (parents.hasNext()) {
    const p = parents.next();
    if (p.getId() !== folderId) p.removeFile(file); // 只保留新資料夾
  }
}


如果你走 Slides API / Drive API,記得額外 scopes,並遵守「最小權限」原則。


進階:create() vs「用範本複製」

有時候你不是「空白建立」,而是「拿既有範本再改」。這時候:

        SlidesApp.create():全新的空白簡報,適合從零組裝。

        複製範本:

                用 Drive API files.copy 複製現成範本,再替換內容(速度也往往更快,因為版型、母片、字型都就緒了)。官方頁面也建議「複製簡報」走 Drive API。


常見錯誤與雷點

1.    建立成功但「找不到在資料夾」

因為預設在根目錄;請照前節搬運或在建立時直接用 Drive API 於指定資料夾建立。

2.    授權不足 / scope 不符

第一次執行要核權限;若你顯式設定 scopes,請確定只要最小需要值(例如 https://www.googleapis.com/auth/presentations)。Apps Script 會自動偵測,但你也能在 manifest 調整。

3.    配額超限(Quota exceeded)

大量建立或插圖時容易踩到 Apps Script 每日上限(含建立簡報、投影片、URLFetch)。把任務分批、錯峰執行,或升級/改走 Workspace 企業帳號(不同帳型的上限不同),細節看官方配額表。

4.    進階服務沒啟用卻呼叫 Slides/Drive API

在 Apps Script 要用 進階服務(不是內建的 SlidesApp)時,記得在「服務」裡開啟,否則呼叫 Slides.Presentations.create() 會報錯。

5.    共用雲端硬碟(Shared Drives)搬移失敗

若目標資料夾在共用雲端硬碟,需同時遵守 Drive API 的共用磁碟規則(包含權限、參數),官方也有專章說明。

6.    觸發器執行環境與使用者權限不一致

用時間觸發器定時產檔時,授權主體可能是安裝者或擁有者;若要跨資料夾搬檔,確認執行身分與資料夾權限相容。原則上把資料夾權限交給執行帳戶最省事。

7.    字型 / 版面跑掉

產生內容時若不指定版型,預設的 TITLE_AND_BODY 通常夠用;若你有企業模板,建議改走「複製範本」路線,能確保母片、色票一致。


問題集

Q1:可以直接在特定資料夾「建立」嗎?

用 SlidesApp.create() 不行;你要嘛先建立再移動,要嘛用 Drive API files.create 指定資料夾建立(mimeType 設為簡報)。這是官方在 Slides API 指南明寫的限制與替代方案。

Q2:create() 回傳的 Presentation 可以直接編輯嗎?

可以。SlidesApp.create() 就是會「建立並開啟可編輯的簡報」,回傳 Presentation 物件,立刻就能 .appendSlide() 等操作。

Q3:大量建立簡報要注意什麼?

關鍵是配額與速率:看官方配額表,並把工作分段;若要抓網路圖片,還有 URLFetch 次數上限。

Q4:Scopes 要我自己填嗎?

多半不必。Apps Script 會自動偵測需要的 Scopes;除非發佈外掛或有特殊需要,才在 manifest 顯式設定。


一次看完:create() 的實戰套路

1.    定義命名規則(例:產品-週報-YYYY-MM-DD)

2.    SlidesApp.create(title) 建檔(回傳 Presentation)

3.    插入首張標題投影片(TITLE_AND_BODY 版型)填上標題、要點

4.    依資料(試算表 / API)動態生成 N 張章節

5.    必要時插圖(URLFetch → blob)並注意配額

6.    移動到專案資料夾(DriveApp 或 Drive API)

7.    回傳 URL + ID、寫入日誌/通知(Mail/Chat)


範例:週報產生器(精簡版)

function weeklyReport() {
  const title = `行銷週報_${new Date().toISOString().slice(0,10)}`;
  const pres = SlidesApp.create(title);

  // 首頁
  const cover = pres.getSlides()[0]; // 新檔通常會有一張預設投影片
  cover.insertTextBox(title, 60, 60, 600, 60);

  // 本週亮點
  const s1 = pres.appendSlide(SlidesApp.PredefinedLayout.TITLE_AND_BODY);
  s1.getShapes().forEach(sh => {
    const ph = sh.getPlaceholder();
    if (!ph) return;
    if (ph.getType() === SlidesApp.PlaceholderType.TITLE) sh.getText().setText('本週亮點');
    if (ph.getType() === SlidesApp.PlaceholderType.BODY) sh.getText().setText('• 活動 A CTR 3.2%\n• 關鍵字 B 成長 18%\n• 渠道 C CAC 降 12%');
  });

  // 生成完移動到專案資料夾(選配)
  const folderId = '你的資料夾ID';
  moveToFolder(pres.getId(), folderId); // 以 DriveApp 搬運,見前文範例
  Logger.log('Done: %s', pres.getUrl());
}


上述流程用到的 create() 與列舉型別皆屬 Slides 服務原生能力;搬移檔案用 Drive 服務。


張貼留言 (0)
較新的 較舊