Как я могу автоматизировать перемещение ответов формы из таблицы Google в документ Google с помощью скриптов Google?

У меня есть приложения, добавляемые в электронную таблицу Google. По сути, я пытаюсь отправить слияние каждого приложения (строки) на страницу в длинном документе Google, который я могу читать через приложения. Итак, я пытаюсь написать сценарий Google, который 1. извлекает каждую строку из электронной таблицы ответов формы, 2. копирует шаблон документа, 3. вставляет шаблон во вновь созданный документ и 4. заменяет текст шаблона на форма ответа.

Вместо того, чтобы создавать отдельный документ для каждого приложения, я надеюсь просто добавить разрыв страницы после замены текста из предыдущей строки, а затем снова скопировать шаблон. Таким образом, код просто перебирает все строки в электронной таблице, и мне нужно открыть только один документ, чтобы прочитать приложения.

Вот код, с которым я работал. Я использовал множество руководств, чтобы добраться до этого момента, но я не могу понять, как правильно перебирать строки / абзацы. Последняя итерация моего кода привела к появлению всех имен на первой странице, затем идентификатора, затем электронной почты. Скорее, чем вся информация одного человека на первой странице. Итак, я внес больше изменений, и теперь во вновь созданном документе Google ничего не отображается.

У меня проблемы с вложенной функцией updateDoc (). Все остальное вроде работает нормально. Циклы foreach и for - это то, что меня сбивает. Массив внутри массива - это не то, с чем я работал до этого проекта. (См. Строки 4 и 5 функции updateDoc ())

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();
    }); 
  }
}

person user16020437    schedule 24.05.2021    source источник
comment
Чтобы подтвердить вашу проблему, можете ли вы предоставить образцы значений data и образец документа шаблона templateFile?   -  person Tanaike    schedule 25.05.2021


Ответы (2)


Ваш код отправляет все строки данных для каждой строки данных в вашу 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();
});

to

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();
}
person azawaza    schedule 25.05.2021

Спасибо @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();
    }
  }
}
person user16020437    schedule 01.06.2021