【问题标题】:How can I automate moving form responses from a google sheet to a google doc using google scripts?如何使用谷歌脚本自动将表单响应从谷歌表格移动到谷歌文档?
【发布时间】:2021-05-24 21:38:10
【问题描述】:

我有应用程序进入谷歌电子表格。从本质上讲,我正在尝试将每个应用程序(行)邮件合并到一个长谷歌文档中的一个页面,我可以在上面阅读应用程序。所以我正在尝试编写一个 google 脚本,它 1. 从表单的响应电子表格中提取每一行,2. 复制模板文档,3. 将模板粘贴到新制作的文档中,以及 4. 将模板的文本替换为表单的响应。

我希望在替换上一行的文本后添加一个分页符,然后再次复制模板,而不是为每个应用程序制作单独的文档。这样,代码只会遍历电子表格中的所有行,而我只需打开一个文档即可阅读应用程序。

这是我一直在使用的代码。我已经使用了大量的教程来达到这一点,但我无法弄清楚如何正确地循环遍历行/段落。我的代码的最后一次迭代产生了第一页上的所有名称,然后是 ID,然后是电子邮件。而不是第一页上的所有个人信息。所以我做了更多的改变,现在新制作的谷歌文档中没有任何内容。

嵌套函数 updateDoc() 是我遇到的问题。其他一切似乎都正常工作。 foreach 和 for 循环让我失望。数组中的数组不是我在这个项目之前使用过的东西。 (参见 updateDoc() 函数中的第 4 行和第 5 行)

function AutoFill() {
  // Global variables
  var templateFile = DocumentApp.openById('theID');
  var newDoc = DocumentApp.create('CopyOf'+ templateFile.getName());
  var copyTemplate = templateFile.getBody().getParagraphs();
  
  newDoc.getBody().clear();

  var sourceFileId = newDoc.getId();
  var targetFolderId = 'thisID';
  
  // Pull the data from spreadsheet
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  Logger.log('data pulled');
  data.forEach(function(r){
    updateDoc(data, copyTemplate, newDoc);
  });
  
  moveFiles(sourceFileId, targetFolderId); 
  Logger.log('File Moved');
  // move newDoc to 'Populated Applications' Folder
  function moveFiles(sourceFileId, targetFolderId) {
    var file = DriveApp.getFileById(sourceFileId);
    var folder = DriveApp.getFolderById(targetFolderId);
    file.moveTo(folder);
  } 

  // Update the doc w/ data from spreadsheet
  function updateDoc(data, copyTemplate, newDoc) {
    var rows = data.length;
    var cols = data[0].length;
    var rowNumber = 1;
    copyTemplate.forEach(function(p){
      for (var a=1; a < rows; a++){
          newDoc.getBody().appendParagraph(
          p
          .copy()
          .replaceText('{{name}}', data[a][2])
          .replaceText('{{ccaId}}', data[a][3])
          .replaceText('{{email}}', data[a][1])
          .replaceText('{{academicProgram}}', data[a][4])
          .replaceText('{{year}}', data[a][5])
          .replaceText('{{positions}}', data[a][6])
          .replaceText('{{Response1}}', data[a][7])
          .replaceText('{{Response2}}', data[a][8])
          .replaceText('{{Response3}}', data[a][9])
          .replaceText('{{Response4}}', data[a][10]));
          Logger.log(a + 'page completed'); 
      };
      newDoc.getBody().appendPageBreak();
    }); 
  }
}

【问题讨论】:

  • 为了确认您的问题,能否提供data的样例值和templateFile的样例模板文档?

标签: javascript google-apps-script google-sheets google-docs mailmerge


【解决方案1】:

您的代码将每行数据的所有数据行发送到您的 updateDoc() 函数,然后该函数处理模板中每个段落的所有数据行 - 这就是您得到结果的原因。

替换

data.forEach(function(r){
  updateDoc(data, copyTemplate, newDoc);
});

只有

updateDoc(data, copyTemplate, newDoc);

改变

copyTemplate.forEach(function(p){
  for (var a=1; a < rows; a++){
    newDoc.getBody().appendParagraph(
          p
          .copy()
          .replaceText('{{name}}', data[a][2])
          .replaceText('{{ccaId}}', data[a][3])
          .replaceText('{{email}}', data[a][1])
          .replaceText('{{academicProgram}}', data[a][4])
          .replaceText('{{year}}', data[a][5])
          .replaceText('{{positions}}', data[a][6])
          .replaceText('{{Response1}}', data[a][7])
          .replaceText('{{Response2}}', data[a][8])
          .replaceText('{{Response3}}', data[a][9])
          .replaceText('{{Response4}}', data[a][10]));
          Logger.log(a + 'page completed'); 
  };
  newDoc.getBody().appendPageBreak();
});

到

for (var a=1; a < rows; a++){
  copyTemplate.forEach(function(p){
    newDoc.getBody().appendParagraph(
      p
      .copy()
      .replaceText('{{name}}', data[a][2])
      .replaceText('{{ccaId}}', data[a][3])
      .replaceText('{{email}}', data[a][1])
      .replaceText('{{academicProgram}}', data[a][4])
      .replaceText('{{year}}', data[a][5])
      .replaceText('{{positions}}', data[a][6])
      .replaceText('{{Response1}}', data[a][7])
      .replaceText('{{Response2}}', data[a][8])
      .replaceText('{{Response3}}', data[a][9])
      .replaceText('{{Response4}}', data[a][10])
    );
    Logger.log(a + ' page completed');
  }
  newDoc.getBody().appendPageBreak();
}

【讨论】:

    【解决方案2】:

    感谢 @azawaza 修复了我遇到的 for 循环 / forEach 问题。这是工作代码。我希望它在未来对其他人有所帮助。

    function AutoFill() {
      // Global variables
      var templateFile = DocumentApp.openById('yourTemplateID');
      var newDoc = DocumentApp.create('CopyOf'+ templateFile.getName());
      var copyTemplate = templateFile.getBody().getParagraphs();
      
      newDoc.getBody().clear();
    
      var sourceFileId = newDoc.getId();
      var targetFolderId = 'yourFolderId';
      
      // Pull the data from spreadsheet
      var sheet = SpreadsheetApp.getActiveSheet();
      var data = sheet.getDataRange().getValues();
      Logger.log('data pulled');
      updateDoc(data, copyTemplate, newDoc); 
      
      moveFiles(sourceFileId, targetFolderId); 
      Logger.log('File Moved');
      // move newDoc to 'Populated Applications' Folder
      function moveFiles(sourceFileId, targetFolderId) {
        var file = DriveApp.getFileById(sourceFileId);
        var folder = DriveApp.getFolderById(targetFolderId);
        file.moveTo(folder);
      } 
    
      // Update the doc w/ data from spreadsheet
      function updateDoc(data, copyTemplate, newDoc) {
        var rows = data.length;
        var cols = data[0].length;
        var rowNumber = 1;
    
        for (var a=1; a < rows; a++){
          copyTemplate.forEach(function(p){
                  newDoc.getBody().appendParagraph(
                    p
                    .copy()
                    .replaceText('{{name}}', data[a][2])
                    .replaceText('{{ccaId}}', data[a][3])
                    .replaceText('{{email}}', data[a][1])
                    .replaceText('{{academicProgram}}', data[a][4])
                    .replaceText('{{year}}', data[a][5])
                    .replaceText('{{positions}}', data[a][6])
                    .replaceText('{{Response1}}', data[a][7])
                    .replaceText('{{Response2}}', data[a][8])
                    .replaceText('{{Response3}}', data[a][9])
                    .replaceText('{{Response4}}', data[a][10])
                  ); 
          }); 
          Logger.log(a + 'page completed');
          newDoc.getBody().appendPageBreak();
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多