google-apps-script - 如何在 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());
解决方案
要使用它,您需要通过打开文档并导航到 [工具 > 脚本编辑器] 将脚本绑定到模板文档。粘贴并保存下面的代码,然后重新打开文档。使用 [报告 > 创建报告] 输入所需信息并创建新报告。使用 [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;
}
推荐阅读
- sql - 创建自定义序列
- kubernetes - KUBECTL 错误:服务器已要求客户端提供凭据
- html - Angular 材质扩展面板点击事件
- python - 为什么我在 Python 请求中收到 502 代理错误?
- java - 运行方法时应用程序冻结
- r - R:层函数中未使用的参数
- android - 如何重现 IllegalStateException 不允许启动服务 Intent 应用程序在后台
- eclipse - STS:创建 Java 虚拟机失败
- javascript - 每次使用 onClick 事件时如何防止变量返回原始值
- recaptcha - reCAPTCHA v3:g-recaptcha-response 在表单之外