iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Modern Web

整合 Google 服務的燃料——透過 Google Apps Script (GAS) 加速你的工作速度系列 第 14

D14 - 如何用 Apps Script 自動化地創造與客製 Google Docs?(一) 以 NDA 為例的大架構與簡單複製

  • 分享至 

  • xImage
  •  

今天的目標

現在幾乎每天都會打開 Google Doc,但有時就是會有很多類似的文件,其實只要調整一點點東西,可能是薪資單、要交的報告、給客戶的企劃書(X)。總之,我們不時會需要「調整 Google Doc 中的一點點部分」,請問我們能怎麼做?

今天的主題是,每次要跟不同的廠商與單位簽 NDA,如果比較一般的合作,那就可以拿範本,但如果是比較深度的合作,老闆總會想要搞一點客製,那要怎麼簡單將這件事自動化呢?

  1. 要如何自動依照範本創造並微調 Google 文件(Google Docs)?

今天只有一個問題,那我們就開始吧!


Q1. 要如何自動依照範本創造並微調 Google 文件(Docs)?

Step 1 開啟 Google Sheet,並串起 GAS

今天勤勞一點先把影片錄起,總之先開一個 Google Sheet 的並串接 GAS。

一樣在最一開始執行時會有「需要驗證」出現,讓我借用一下 D2 的影片。

Step 2 設定要要填入 Google Docs 的參數

關於創造文件,我們可以選擇複製範本(像是 D11 複製並客製你的 Google Form),或是創造新的文件(像是 D12 幅度客製你的 Google Form);這次我會針對複製「新文件」來做介紹,也就是 D12 的那種版本。那我們要長出什麼樣子呢?這邊先給大家看我們的參數們。

這邊我們簡單設定了三個參數 Name(文件的名字)、Header 和 Footer。

為什麼選這些參數呢?因為每一份 Google Doc 其實都有這樣的架構。分別是文章內部的 Header、Body、Footer;以及額外的 Url、Name 和 Id。來讓我們看一下一份 Google Docs 的架構——

今天我們會主要講結構的 HeaderFooterBody 怎麼抓,待因為抓入每一個結構,內步的調整就會包含很多客製化的部分,我會於明天另外以完整的篇幅介紹。

Step 3 讀取 Sheet 內的資料

那一樣我們要先讀取表單內的資料,透過老朋友 readSheetData() 來完成。這邊不懂可以參照 D11 和 D4。

function readSheetData(){
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getActiveSheet();
  let start_row = 2;
  let start_col = 1;
  let numRows = sheet.getLastRow() - start_row +1;
  let numCols = sheet.getLastColumn() - start_col +1;;
  let values = sheet.getRange(start_row,start_col,numRows,numCols).getValues();
  Logger.log(values);
  return values;
}

讓我們來看一下跑起來的畫面——

Step 4 用 DocumentApp.create() 來創造文件

好,那接著就要創造文件了。這邊我們會用到兩個功能,分別是 moveFile()DocumentApp.create()

首先 moveFile() 的執行細節在 D12 有講到,我們就快速看過程式碼。

function moveFile(fileId, destinationFolderId) {
  let destinationFolder = DriveApp.getFolderById(destinationFolderId);
  DriveApp.getFileById(fileId).moveTo(destinationFolder);
}

那新的 function 是 DocumentApp.create() 雖說是新的,但其實就是簡單地創造一個新的文件檔案。實際執行時,要抓出你要放在哪一個 folder,把 "your_id_here 換掉。

var target_folder_ID= "your_id_here";

function createDoc(file_name) {
  let new_doc = DocumentApp.create(file_name);
  let doc_id = new_doc.getId();
  moveFile(doc_id, target_folder_ID)
}

我們來看一下跑起來長怎麼樣——

Step 5 針對結構寫入內容(文字)

好,那我們現在已經能創造文件,現在要來看怎麼樣「寫入內容」。我們來看看程式碼先——

function createDoc() {
  let new_doc = DocumentApp.create('D14 practice');
  let doc_id = new_doc.getId();
  moveFile(doc_id, target_folder_ID)
  let header = new_doc.addHeader();
  let footer = new_doc.addFooter();
  new_doc.setName("Hi, Amy")
  header.setText("Amy's NDA");
  footer.setText("2021/09/14");
}

比較值得一提的是,在 Google Doc 中,「寫入內容」都是要——

先把結構叫出來,再針對結構進行調整
就是下圖這樣,都是要先叫出 Object。

像是其中這段, header 是結構,再用 setText() 設定文字。

  let header = new_doc.addHeader();
  header.setText("Amy's NDA");

跑起來長這樣——

好,那看來有...

  1. setName 改到名稱
  2. header.setText 有改到 header
  3. footer.setText 有改到 footer

接著,就是大量製作了!

Step 6 針對每個參數創造文件

這邊我們先將原本的 createDoc() 改為可以輸入參數,分別是我們最一開始資料的 nameheader_textfooter_text。換句話說,如果我們想創造和 Step 5 一樣的文件,就要改成輸入 createDoc("Hi! Amy", "Amy's NDA", "20210914") 即可。

function createDoc(name, header_text, footer_text) {
  let new_doc = DocumentApp.create('D14 practice');
  let doc_id = new_doc.getId();
  moveFile(doc_id, target_folder_ID)
  let header = new_doc.addHeader();
  let footer = new_doc.addFooter();
  new_doc.setName(name)
  header.setText(header_text);
  footer.setText(footer_text);
}


function createDocsFromSheet(){
  let data = readSheetData();
  for (row_data of data){
    let name = row_data[0];
    let header_text = row_data[1];
    let footer_text = row_data[2];
    Logger.log(name+ " "+ header_text + " "+ footer_text);
    createDoc(name, header_text, footer_text);
  }
}

我們另外再創造一個 createDocsFromSheet() 把 Sheet 裡面的資料解構,並輸入上面那個 createDoc() 當中。這邊要注意的是,如

最後跑起來長這樣——


好,那今天就是我們的 D14。提醒的是,創造文件有 Quota 限制——每天不超過 250 件。明天我會介紹當有很多文件要產出時,內部細節到底要怎麼寫。

如果還有問題,透過留言之外,也可以到 Facebook Group,想開很久這次鐵人賽才真的開起來哈哈哈,歡迎來當 Founding Member。如果不想錯過可以訂閱按讚小鈴鐺(?),也歡迎留言跟我說你還想知道什麼做法/主題。我們明天見。


上一篇
如何用 Apps Script 寄出客製化的 Google 表單並搜集分散在 Google Sheet 中的回應?(三)一次搜集很多 Google Form 內的回應
下一篇
D15 - 如何用 Apps Script 自動化地創造與客製 Google Docs?(二)快速生出大量寄件信封資料
系列文
整合 Google 服務的燃料——透過 Google Apps Script (GAS) 加速你的工作速度30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言