《零基礎快速入門:GenAI 搭配 Google Apps Script 的工作自動化寶典》Chapter 4-3 真實案例:自動翻譯 Google Slides 備忘稿

1. 引言

今天,我們來聊聊一個跟簡報相關的實用案例。

如果你像我一樣:
英文不夠好,但有時候必須用英文做簡報,
那大概也會像我一樣:
把簡報的英文逐字稿都先準備好。

但如果你真的像我一樣,
連英文逐字稿都不知道怎麼寫,
那很可能就只能跟我一樣,
先寫中文的稿子再用翻譯工具翻成英文。

今天這篇文章就要教你如何利用 GenAI 和 Google Apps Script 自動翻譯 Google Slides 備忘稿。

2. 案例背景 (Case Background)

我在準備簡報的時候,
會幫每一頁的切換時機都想好一個轉場銜接的台詞。
所以我的每一段逐字稿都會有很精準對應的投影片頁數,
該在哪裡講,就在哪裡講。

因此我寫逐字稿的時候,
不會把整個簡報的內容寫在一處,
而是會分散寫在各頁投影片下方。

但是當我把每一頁的稿子各自寫好後,
也就沒辦法整個複製拿去翻譯。
而是要一頁一頁地複製、一段一段地貼上,
非常麻煩。

3. 解決方案:如何使用 GenAI 產生自動翻譯程式碼

我們可以這樣發問:

我有一份 Google Slides,id 是 “1WRGTbfwKocOGiDU04MTr8I5fJOL_mdwqoyJ7XS19fSk”
請幫我撰寫一段 Google Apps Script 程式碼,將每一張投影片的備忘稿內容翻譯成英文,並將翻譯結果附加在原本的備忘稿內容後方。

補充說明:

這裡說的 id,指的是你的 Google Slides 的 id,可以從 URL 上找到這個資訊。
例如當 URL 是 https://docs.google.com/presentation/d/1WRGTbfwKocOGiDU04MTr8I5fJOL_mdwqoyJ7XS19fSk/edit#slide=id.p
id 就是中間最長最雜亂的這一段:1WRGTbfwKocOGiDU04MTr8I5fJOL_mdwqoyJ7XS19fSk

或是你也可以先問 ChatGPT:「請問我要怎麼查看我的 Google Slides 的 Id?」

當 ChatGPT 幫我們寫好程式,
我們就拿去執行試試看。

結果執行失敗,遇到 error:Exception: Invalid argument: source

不用擔心,這是人之常情。
就算是資深工程師也常遇到 error。
我們只要把這個 error 回饋給 ChatGPT,
他就會再修正一下程式了。

果然,兩三次來回問答後,
我們就得到了一段改良後的可執行程式碼:

function translateSpeakerNotesToEnglish() {
    var presentationId = '1WRGTbfwKocOGiDU04MTr8I5fJOL_mdwqoyJ7XS19fSk';
    var presentation = SlidesApp.openById(presentationId);
    var slides = presentation.getSlides();

    slides.forEach(function(slide) {
      var speakerNotes = slide.getNotesPage().getSpeakerNotesShape();

      if (speakerNotes && speakerNotes.getText()) {
        var originalText = speakerNotes.getText().asString();

        // 檢查是否有非空的內容
        if (originalText.trim() !== '') {
          Logger.log(originalText);
          try {
            // 使用 LanguageApp 翻譯成英文
            var translatedText = LanguageApp.translate(originalText, 'zh', 'en');
            var updatedText = originalText + '\n\n(Translated to English:)\n' + translatedText;

            // 更新備忘稿內容
            speakerNotes.getText().setText(updatedText);
          } catch (e) {
            Logger.log('Translation error for slide: ' + slide.getObjectId() + ', Error: ' + e.message);
          }
        } else {
          Logger.log('No speaker notes found for slide: ' + slide.getObjectId());
        }
      }
    });

    Logger.log('Translation process completed.');
  }

4. Google Apps Script 解說

這段程式碼的工作流程:

  1. 開啟 Google Slides 文件並獲取所有投影片。
  2. 對每一張投影片檢查是否有備忘稿內容。
  3. 如果有內容,將內容從中文翻譯成英文,並將翻譯結果附加在原有內容後。
  4. 如果過程中發生錯誤,會記錄錯誤但不會中斷流程。
  5. 最終所有投影片處理完成後,會記錄一條訊息表示翻譯工作結束。

這段程式碼確保能夠順利處理有備忘稿的投影片,同時避免翻譯失敗或無效翻譯的問題。
有興趣的人可以看一下以下程式碼的細節說明,
沒興趣就可以快速略過,不影響我們的自動化目標。

  1. function translateSpeakerNotesToEnglish()
    這是整個函數的起點,這個函數會被執行來處理翻譯工作。
  2. var presentationId = '1WRGTbfwKocOGiDU04MTr8I5fJOL_mdwqoyJ7XS19fSk';
    這一行定義了 Google Slides 文件的 ID。這個 ID 代表的是一個特定的 Google Slides 文件。此處已經將您提供的 Slides ID 填入。
  3. var presentation = SlidesApp.openById(presentationId);
    這一行使用 SlidesApp.openById() 函數打開指定的 Google Slides 文件。這樣就能夠訪問這個文件中的投影片。
  4. var slides = presentation.getSlides();
    這行程式碼會獲取該簡報中的所有投影片,並將它們存儲在 slides 陣列中。
  5. slides.forEach(function(slide) { ... });
    這裡使用 forEach() 方法遍歷每一張投影片 (slide)。接下來的操作會對每一張投影片依次進行處理。
  6. var speakerNotes = slide.getNotesPage().getSpeakerNotesShape();
    每張投影片都有一個備忘稿區域(Speaker Notes)。這一行程式碼會獲取備忘稿的形狀對象(speakerNotes)。如果備忘稿存在,接下來的程式碼將進一步處理它。
  7. if (speakerNotes && speakerNotes.getText()) {
    這一行進行了一個條件檢查,確保備忘稿對象存在並且有文字內容。這樣可以避免嘗試翻譯不存在的備忘稿。
  8. var originalText = speakerNotes.getText().asString().trim();
    這一行將備忘稿的文字內容提取出來,並使用 trim() 移除前後的空白字元,存儲到 originalText 變數中。
  9. if (originalText !== '') {
    這裡再次檢查備忘稿內容是否為空。空內容不需要翻譯,所以如果有內容,程式碼會進入下一步。
  10. var translatedText = LanguageApp.translate(originalText, 'zh', 'en');
    這一行使用 LanguageApp.translate() 函數將備忘稿從中文翻譯成英文。此處指定來源語言為 'zh'(中文),目標語言為 'en'(英文)。如果備忘稿是其他語言,可以更改 'zh' 為對應的語言代碼。
  11. if (translatedText && translatedText !== originalText) {
    這行程式碼確保翻譯結果存在且與原始文本不同。如果翻譯的結果與原始文本相同,這可能表示翻譯失敗或者不需要翻譯,因此會跳過附加翻譯的步驟。
  12. var updatedText = originalText + '\n\n(Translated to English:)\n' + translatedText;
    這行將原始文本和翻譯結果組合起來,翻譯的英文內容會附加在原備忘稿後面,並加上 (Translated to English:) 以標示這是翻譯內容。
  13. speakerNotes.getText().setText(updatedText);
    這行將更新後的備忘稿內容設置回投影片的備忘稿區域,替換掉原有的文字內容。
  14. } catch (e) { Logger.log('Translation error for slide: ' + slide.getObjectId() + ', Error: ' + e.message); }
    try-catch 用來捕捉翻譯過程中的任何錯誤,並記錄錯誤訊息。如果翻譯過程中出現問題,不會中斷整個程式,而是會跳過有問題的投影片並繼續處理下一張投影片。
  15. Logger.log('No speaker notes found for slide: ' + slide.getObjectId());
    如果投影片中沒有備忘稿內容,會記錄一條訊息,指出哪一張投影片沒有備忘稿。
  16. Logger.log('Translation process completed.');
    當所有投影片的備忘稿翻譯完成後,記錄一條訊息,標示翻譯過程已完成。

5. 測試與結果 (Testing and Results)

執行程式前的投影片長這樣:


執行程式後的投影片長這樣:


而且不只這一頁,是整份簡報的每一頁都自動翻譯完了。

6. 進階提示

針對備忘稿的處理,
我自己還做了一個功能是:把所有備忘稿集結到最後一頁,
串成一篇完整的文章。

用意是我想要整篇拿去請 ChatGPT 讀給我聽,
幫助我準備英文簡報。

我不想要一段一段分開貼給 ChatGPT,
想要快速地整份貼上,請他整份一起讀完。

關於我怎麼利用 ChatGPT 協助我準備英文簡報,
可以參考這篇文章

7. 結論

這個案例展示了如何利用 GenAI 和 Google Apps Script 來輕鬆自動化翻譯 Google Slides 備忘稿的過程。

即使你沒有程式基礎,
也可以通過簡單的 prompt 請 GenAI 幫你生成自動化程式碼,
並解決日常工作中的重複性任務。

這樣的解決方案不僅節省時間,還能提高工作效率,
讓你有更多時間專注在更具創造性的任務上。
你也可以思考如何將這個案例中的方法應用到自己的工作中,
讓自動化成為你的工作好夥伴。

下一篇,讓我們來看看關於 Email 有什麼自動化可以做。