这是我昨天在Google Apps脚本办公时间环聊中提出的问题的后续内容。
我最后一个剧本的目标是在高中的学生选举中创建一个选举过程,我在那里使用Google表格。该脚本包含三个部分:1)创建唯一的“投票ID”(随机的6位数代码)2)将学生数据(姓名,家庭室和投票ID)与模板文档合并,该文档将创建特定的投票指令每个学生。 (即旧式邮件合并)3)通过检查投票ID并删除重复投票来验证结果。
我遇到问题的脚本部分是学生数据合并(步骤2)。第一个数据集是唯一有效的数据集。其余显示为“DocumentBodySection”。我有一种感觉,就是我如何从文档模板中复制文本或者如何将文本添加到新文档中。
带有数据的电子表格: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();
}
答案 0 :(得分:3)
我通过创建模板的副本,进行文本替换,然后将原始文档中的模板元素附加到副本中来解决此问题。特别是,我使用:var copyTables = templateDoc.getTables();
来获取和存储表(因为我的所有模板数据都包含在表中)和copyDoc.appendTable(copyTables[0].copy() );
来附加副本(.copy()
到最后似乎工作真正的魔力)。这提供了在友好的文档界面中更新模板的灵活性,而无需看到程序员。
答案 1 :(得分:0)
我认为问题在于这一行:
docText.appendText(entryTemplate);
变量entryTemplate包含DocumentBodySection,这就是您在输出中看到的原因。如果您尝试附加原始模板文本的另一个副本,则需要在进入循环之前将其存储。
答案 2 :(得分:0)
我同意Eric的说法,appendText(entryTemplate)不会做你想做的事。
由于您正在尝试与所有学生一起创建一个大型文档,因此使用“模板”并替换文本将无法正常工作。我建议改为使用产生所需格式的api调用在代码中创建“模板”。然后,它可以简单地附加新的学生指令页面。虽然我认为当文件变大时你可能会遇到缓慢...我不知道你有多少学生。