使用Google Apps Script创建“老式”邮件合并时出现问题
Issue with creating an "old-fashioned" mail merge with Google Apps Script
这是我昨天在Google Apps Script办公时间环聊上提出的一个问题的后续。
我最终脚本的目标是为我使用 Google 表单工作的高中的学生选举创建一个选举流程。 该脚本包含三个部分:1(创建唯一的"投票ID"(随机6位代码(2(将学生数据(姓名,班主任和投票ID(与模板文档合并,该模板文档将为每个学生创建特定的投票说明。(即老式的邮件合并( 3( 通过检查投票 ID 并删除重复投票来验证结果。
我遇到问题的脚本部分是学生数据合并(步骤 2(。 第一个数据集是唯一有效的数据集。其余的显示为"文档正文部分"。 我有一种感觉,要么是我如何从文档模板复制文本,要么是如何将文本添加到新文档中。
带数据的电子表格:https://docs.google.com/spreadsheet/ccc?key=0AierVcXWELCudFI1LU10RnlIVHNsUm11a0dDWEV6M1E
文档模板:(有关 url,请参阅后续注释(
脚本创建的文档:https://docs.google.com/document/d/12r2D9SpIVmQYVaasMyMWKjHz6q-ZZyIMEBGHTwlQct8/edit
//Get Settings & Data
ss = SpreadsheetApp.getActiveSpreadsheet();
source_sheet = ss.getSheetByName("Student Data");
settings_sheet = ss.getSheetByName("SETTINGS");
results_column = settings_sheet.getRange("B19").getValue();
source_column = settings_sheet.getRange("B18").getValue();
source_lastrow = source_sheet.getLastRow();
docTemplateID = settings_sheet.getRange("B13").getValue();
docCopyName = settings_sheet.getRange("B14").getValue();
//Merge Student Data with Document
function SendDataMerge () {
// Open docTemplate and Copy Contents to entryTemplate
var docTemplate = DocumentApp.openById(docTemplateID);
var entryTemplate = docTemplate.getActiveSection();
docTemplate.saveAndClose();
// Make a NEW copy of docTemplate
var docTemplate = DocsList.getFileById(docTemplateID);
var docCopy = DocsList.copy(docTemplate, docCopyName);
var docCopyID = docCopy.getId();
// Create Array of Student Data (First, Last, Grouping, VID)
var data = source_sheet.getRange("A2:D"+source_lastrow).getValues();
// Open docCopy for Editing & Clear Contents
var doc = DocumentApp.openById(docCopyID);
var docText = doc.editAsText();
// Run through Student Data
for(var i=0; i<5 /*data.length*/; i++) { //For testing, limit this to 5 entries
var lastName = data[i][0];
var firstName = data[i][1];
var grouping = data[i][2];
var vid = data[i][3];
docText.replaceText('keyLastName', lastName);
docText.replaceText('keyFirstName', firstName);
docText.replaceText('keyGrouping', grouping);
docText.replaceText('keyVID', vid);
docText.appendText(''n*** Appended Text (End of entry) ***');
docText.appendText(entryTemplate);
}
// Save and Close
doc.saveAndClose();
}
我通过创建模板的副本,执行文本替换,然后将原始文档中的模板元素附加到副本中来解决此问题。特别是,我使用了:var copyTables = templateDoc.getTables();
获取和存储表(因为我的所有模板数据都包含在表中(,copyDoc.appendTable(copyTables[0].copy() );
附加副本(最后的.copy()
似乎发挥了真正的魔力(。这提供了在友好的文档界面中更新模板的灵活性,而无需查看程序员。
我认为问题出在这条线上:
docText.appendText(entryTemplate);
变量 entryTemplate 包含一个 DocumentBodySection,这就是您在输出中看到它的原因。如果您尝试附加原始模板文本的另一个副本,则需要在进入循环之前存储该副本。
我同意 Eric 的观点,即 appendText(entryTemplate( 不会做你想要它做的事情。
由于您尝试与所有学生一起创建一个大型文档,因此使用"模板"并替换文本不会很好地工作。 相反,我建议使用生成所需格式的 api 调用在代码中创建"模板"。 然后,它使不断附加学生说明的新页面变得简单。 虽然我认为当文档变大时您可能会遇到缓慢的情况......我不知道你有多少学生。
- 在指令控制器中使用$attrs时出现问题
- JQuery合并了keyup和focusout两个函数
- 将PHP变量传递给jQuery时遇到问题
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 参数变量出现ngTable指令问题
- 剑道网格jQuery动画()问题
- three.js r70:合并three.PlaneBufferGeometries的问题
- 当我尝试合并多个javascript文件时,网站出现问题
- 合并多个<画布>问题
- 我在合并 HTML 和 JavaScript 时遇到问题
- 洛达什 _.合并函数问题
- 使用Google Apps Script创建“老式”邮件合并时出现问题
- 合并两个json字符串时出现问题
- Angular2单元测试Http MockBackend问题-无法读取mergeOptions中未定义的属性合并
- 合并并返回唯一数组问题
- 动态合并对象-对象属性名称问题
- 设置codemmirror合并视图+ Require.js时出现问题
- 在three.js中合并模型和材料的问题
- 合并两个Javascript对象数组的问题
- 将多个字段合并为一个输入字段时出现的问题