首页 > 解决方案 > 如何在 Google 脚本中输入文档 ID/模板 ID 以自动填充模板?

问题描述

希望构建一个 Google 脚本,该脚本将根据某些条目将条目插入到文档中,无论是来自提示还是文本字段(例如,键入为 Name 的内容将替换下面文本中 ##name## 的每个实例。)最接近的 I'我发现我需要的是这个博客https://www.makeuseof.com/tag/google-docs-scripts-automate/。但是,当我按照指示输入文档 ID 时,代码会导致错误。到目前为止,我的代码如下。我一直在用 Google Doc (10IUD6NDli_DThIO4nGaoTYvtcMgIggcB2Gl5zYN8F3Q) 中的 document/d 之后的部分替换 (documentID) 的每个实例,但无济于事。我收到提示并能够回答它们,但没有副本保存到我的云端硬盘的根文件夹中。


function myFunction() {
  // Display a dialog box for each field you need information for.
  
  var ui = DocumentApp.getUi();
  //var response = ui.prompt('Enter Name', 'Enter sales person's name', ui.ButtonSet.OK);
  var nameResponse = ui.prompt('Enter sales persons name');
  var client1Response = ui.prompt('Enter client 1');
  var sales1Response = ui.prompt('Enter sales 1');
    
  //Make a copy of the template file
  var documentId = DriveApp.getFileById('<my-template-id>').makeCopy().getId();
      
  //Rename the copied file
  DriveApp.getFileById(documentId).setName(nameResponse.getResponseText() + date + ' Sales Report');  
      
  //Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();
    
  //Insert the entries into the document
  body.replaceText('##name##', nameResponse.getResponseText());
  body.replaceText('##client1##', client1Response.getResponseText());
  body.replaceText('##sales1##', sales1Response.getResponseText()); 

标签: google-apps-script

解决方案


要使用它,您需要通过打开文档并导航到 [工具 > 脚本编辑器] 将脚本绑定到模板文档。粘贴并保存下面的代码,然后重新打开文档。使用 [报告 > 创建报告] 输入所需信息并创建新报告。使用 [Report > Reset template] 恢复标记以供下次使用。

function onOpen(e) {
  let ui = DocumentApp.getUi();
  ui.createMenu('Report')
    .addItem('Create report', 'createReport')
    .addItem('Reset template', 'resetTemplate')
    .addToUi();
}

/**
 * Creates a copy of the active document, replacing markup with user-specified values.
 */
const createReport = function() {
  try {
    Drive.Files.list();
  }
  catch (e) {
    throw new Error(`Add the 'Drive' service (Services > Drive > Add) to use this function.`);
  }
  
  // Script is container-bound, no ID needed
  let document  = DocumentApp.getActiveDocument();
  let ui        = DocumentApp.getUi();
  
  // Get desired information from user
  let name    = handlePrompt('Enter Name', 'Please enter name of salesperson:', UI);
  let client1 = handlePrompt('Enter Client 1', 'Please enter client 1:', UI);
  let sales1  = handlePrompt('Enter Sales 1', 'Please enter sales 1:', UI);
  if ((name || client1 || sales1) === null)
    return;
  
  // Get the document body
  let body = document.getBody();
  
  // Replace markup with values
  body.replaceText('##name##', name);
  body.replaceText('##client1##', client1);
  body.replaceText('##sales1##', sales1);
  
  // Store values in script properties for the reset() function
  PropertiesService.getScriptProperties()
    .setProperties({
      name:     name,
      client1:  client1,
      sales1:   sales1
    });
  
  // Save copy to Drive
  let resource = {
    title: document.getName()
  };
  Drive.Files.copy(resource, document.getId());
  
  return;
}

/**
 * Resets the document by restoring markup code.
 */
const resetTemplate = function() {
  // Get properties from store
  let properties  = PropertiesService.getScriptProperties();
  let name        = properties.getProperty('name');
  let client1     = properties.getProperty('client1');
  let sales1      = properties.getProperty('sales1');
  
  // Replace values with markup
  let document  = DocumentApp.getActiveDocument();
  let body      = document.getBody();
  body.replaceText(name, '##name##');
  body.replaceText(client1, '##client1##');
  body.replaceText(sales1, '##sales1##');
  
  return;
}

const handlePrompt = function(title, message, ui) {
  let prompt = ui.prompt(title, message, ui.ButtonSet.OK_CANCEL);
  return prompt.getSelectedButton() === ui.Button.OK ?
    prompt.getResponseText() : null;
}

推荐阅读