Эй! Это мой код, который использует последнюю строку электронной таблицы для создания документов Google, кроме того, он помещает ссылку на этот документ в исходную таблицу. Можно ли создать код, который делает это для всех строк на листе? У меня проблемы с использованием .range() для чтения строк по отдельности. Причина этого заключается в том, чтобы просто поддерживать и обновлять сгенерированные данные по сравнению с обновленными.
Заранее спасибо!
var app=SpreadsheetApp.openById("Google ID");
var sheet=app.getSheetByName('Respostas ao formulário 1')
function autoFillLastRow() {
var range=sheet.getDataRange().getValues();
var elem = range.pop();
//e.values is an array of form values
var timestamp = elem[0];
//conversor de datas
let data = new Date(timestamp);
let dataFormatada = ((data.getDate() )) + "/" + ((data.getMonth() + 1)) + "/" + data.getFullYear();
var firstName = elem[1];
var lastName = elem[2];
var title = elem[3];
//file is the template file, and you get it by ID
var file = DriveApp.getFileById('Google Drive ID');
//We can make a copy of the template, name it, and optionally tell it what folder to live in
//file.makeCopy will return a Google Drive file object
var folder = DriveApp.getFolderById('Google Drive ID')
var copy = file.makeCopy(dataFormatada + ', ' + firstName, folder);
//Once we've got the new file created, we need to open it as a document by using its ID
var doc = DocumentApp.openById(copy.getId());
//Since everything we need to change is in the body, we need to get that
var body = doc.getBody();
//Then we call all of our replaceText methods
body.replaceText('{{Nome}}', firstName);
body.replaceText('{{Sobrenome}}', lastName);
body.replaceText('{{Título}}', title);
//Lastly we save and close the document to persist our changes
doc.saveAndClose();
//edit cell
var coluna = 5;
var linha = sheet.getLastRow();
var docId = doc.getId();
sheet.getRange(linha, coluna,1,1).setValue("https://docs.google.com/document/d/" + docId);
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


function createDocforEveryRowofSpreadsheet() {
var ss = SpreadsheetApp.openById("Google ID");
var sh = ss.getSheetByName('Respostas ao formulário 1')
var file = DriveApp.getFileById('Google Drive ID');
var folder = DriveApp.getFolderById('Google Drive ID')
var [hA,...vs] = sh.getDataRange().getValues();
vs.forEach((r,i) => {
var ts = r[0];
let data = new Date(ts);
let dataFormatada = Utilities.formatDate(new Date(ts), Spreadsheet.getSpreadsheetTimeZone(), "dd/MM/yyyy")
var firstName = r[1];
var lastName = r[2];
var title = r[3];
var copy = file.makeCopy(dataFormatada + ', ' + firstName, folder);
var doc = DocumentApp.openById(copy.getId());
var body = doc.getBody();
body.replaceText('{{Nome}}', firstName);
body.replaceText('{{Sobrenome}}', lastName);
body.replaceText('{{Título}}', title);
doc.saveAndClose();
})
}
Предположение для этой функции заключалось в том, что это была одна строка заголовка, которая помещается в hA, а остальные данные помещаются в двумерный массив vs, поэтому код, следующий за этой строкой, является просто методом массива forEach.
Во-первых, большое спасибо, так код становится бесконечно чище! Но моим препятствием является правильное видение этой переменной: var [hA,...vs] = sh.getDataRange().getValues(); И, к сожалению, код не может следовать этому синтаксису: vs.forEach((r,i) => ()) { Не могли бы вы мне помочь? (Я использую для этого скрипт приложений Google)