javascript - 使用 Google Apps 脚本创建 "old-fashioned"邮件合并时出现问题

标签 javascript google-apps google-apps-script

这是我昨天在 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();
  }

最佳答案

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

关于javascript - 使用 Google Apps 脚本创建 "old-fashioned"邮件合并时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10537384/

相关文章:

python - python-openid 和 Google Apps 联合登录的错误

google-analytics - 将多个 google 分析帐户合并为 1 个具有多个配置文件的帐户

javascript - 删除多列,然后在 Google 表格(脚本编辑器)中按价格排序

javascript - 将一组 JSON 对象从 Google 表格传递到 HTML 服务

javascript - 使用 Apps 脚本在 onclick 内调用函数

javascript - 检查字符串是否在列表中(JavaScript)

javascript - 使用 Angular 5 自动显示 DWT Java 脚本库进度对话框

openid - Google Apps 域作为 OpenID 提供商

javascript - 防止 isNaN 隐式转换为数字

javascript - 如何从具有多个键的json对象收集数据并将所有值推送到单个键:value array