3

这是我昨天在 Google Apps Script Office Hours Hangout 上提出的一个问题的后续。

我的最终脚本的目标是为我使用 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();
  }
4

3 回答 3

3

我通过创建模板副本、进行文本替换然后将原始文档中的模板元素附加到副本中来解决此问题。特别是,我使用了:var copyTables = templateDoc.getTables();获取和存储表(因为我的所有模板数据都包含在一个表中)并copyDoc.appendTable(copyTables[0].copy() );附加副本(.copy()最后似乎可以发挥真正的魔力)。这提供了在友好的文档界面中更新模板的灵活性,而无需看到程序员。

于 2012-09-27T16:46:48.023 回答
0

我认为问题出在这一行:

docText.appendText(entryTemplate);

变量 entryTemplate 包含一个 DocumentBodySection,这就是您在输出中看到它的原因。如果您尝试附加原始模板文本的另一个副本,则需要在进入循环之前存储它。

于 2012-05-11T13:55:21.510 回答
0

我同意 Eric 的观点,即 appendText(entryTemplate) 不会做你想做的事。

由于您尝试创建一个包含所有学生的大型文档,因此使用“模板”并替换文本效果不佳。相反,我建议使用生成所需格式的 api 调用在代码中创建“模板”。然后,它可以很容易地继续附加新的学生说明页面。虽然我认为当文档变大时你可能会遇到缓慢......我不知道你有多少学生。

于 2012-05-14T00:03:18.077 回答