Я новичок, когда дело доходит до сценариев Google.Я нашел в Интернете некоторый код, который берет информацию из текущей строки листа Google (полученную из формы) и помещает ее в документ Google (немного похожий на mailmerge, но только для текущей строки).Я адаптировал его под свои нужды.
Вот что происходит.Пользователь заполняет форму, связанную с листом.Существует ряд вычислений, которые выполняются на листе с использованием массива-формулы для предоставления дополнительной информации для документа.В какой бы строке пользователь ни щелкнул созданную мной кнопку, информация из этой строки будет перенесена в шаблон документа.
Это прекрасно работает для верхней строки (строка 2, где строка 1 - строка заголовка)но когда я пытаюсь запустить его для строки 3, единственной информацией из листа, который передает, является информация, не относящаяся к формуле массива, т.е. информация, введенная в форму, а не вычисленная информация!
Может кто-нибудь дать мне некоторое представление опочему и если есть решение?
Вот копия используемого кода:
var employee_ID = "";
var SOURCE_TEMPLATE = "1roWDiQ8NuMF06thK-bim0iwmX1_mbjvvcNIDAxfZZlI";
var employee_SPREADSHEET = "1sFWhuN_nSVEWvuPjWz2gKPdDSKw8DJBe8uoapItC0G4";
var TARGET_FOLDER = "1teL41C9NM0O5ma_2BUNe-MMX0rkSiA4h";
function getCurrentRow() {
var currentRow =
SpreadsheetApp.getActiveSheet().getActiveSelection().getRowIndex();
return currentRow;
}
function getRowAsArray(sheet, row) {
var dataRange = sheet.getRange(row, 1, 1, 99);
var data = dataRange.getValues();
var columns = [];
for (i in data) {
var row = data[i];
Logger.log("Got row", row);
for(var l=0; l<99; l++) {
var col = row[l];
if(!col) {
break;
}
columns.push(col);
}
}
return columns;
}
function createDuplicateDocument(sourceId, name) {
var source = DriveApp.getFileById(sourceId);
var targetFolder = DriveApp.getFolderById(TARGET_FOLDER);
var newFile = source.makeCopy(name, targetFolder);
return DocumentApp.openById(newFile.getId());
}
function generateEmployeeDatasheet() {
var data = SpreadsheetApp.openById(employee_SPREADSHEET);
if(!employee_ID) {
employee_ID = getCurrentRow();
if (employee_ID == 1) {
var employee_ID = Browser.msgBox("You need your cursor to be on the
row within which you are working ", Browser.Buttons.OK);
}
}
var sheet = data.getSheets()[1];
var columns = getRowAsArray(sheet, 1);
Logger.log("Processing columns:" + columns);
var row = getRowAsArray(sheet, employee_ID);
Logger.log("Processing data:" + row);
var employeeName = row[2];
var timeStamp = row[0];
var employeeDate = row[51];
var target = createDuplicateDocument(SOURCE_TEMPLATE, employeeName + "
Final Pay Letter " + employeeDate);
Logger.log("Created new document:" + target.getId());
for(var i=0; i<columns.length; i++) {
var body = target.getActiveSection();
body.replaceText("<<Name>>",row[2]); //col C
body.replaceText("<<Final pay period>>",row[4]); //col E
body.replaceText("<<Training details1>>",row[9]); //col J
}
}
Обновление 04/10/18 Похоже, что моя проблема существует в функции getRowsArray и вв частности:
if(!col) {
break;
}
Если в моих данных электронной таблицы есть нулевая запись, функция прерывается, и поэтому данные, расположенные дальше по строке электронной таблицы, не фиксируются.
Кто-нибудь теперь может это изменить, так чтофункция идентифицирует последний столбец в строке по-другому?