Итак, у меня есть форма Google, подающая на лист, и из таблицы я делаю документы Google из шаблона с ответами в таблице.
Форма имеет возможность сохранить на полпути и вернуться позже через пользовательский вопрос, спрашивающий, хотят ли они сохранить и вернуться (это отправляет форму). Скрипт в моей электронной таблице активирует onFormSubmit, поэтому, когда они выходят, шаблон создается с половиной ответов. Когда они в конце концов вернутся и закончат его, я хочу, чтобы скрипт знал, где создать шаблон.
Например, еще 5 строк были добавлены, так как они выходят, и скрипт создает шаблон из ручного изменения строки «var тактика» путем изменения чисел в строке. например если бы я собирался протестировать другую запись, я сначала изменил бы номера на следующую пустую строку, затем, когда форма будет отправлена, она будет использовать эту строку. Не практично. Это не сработает.
Я немного осмотрелся и нашел onEdit (e), но это не сработает, если это не запись manual .
У меня вопрос, есть ли другой способ, кроме onEdit, чтобы найти последнюю ячейку ОБНОВЛЕНО , а не ДОБАВЛЕНО иначе это будет захватить последнюю строку в листе, который я надеваю не хочу Если он захватит последнюю обновленную ячейку, он получит правильную строку, для которой будет запускаться скрипт. Я добавлю свой сценарий внизу, если это поможет. Идентификаторы и т. Д., Очевидно, были удалены.
Есть идеи?
function onFormSubmit(e) {
var Sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var headers = Sheets.Spreadsheets.Values.get('myID', 'A1:U1');
var tactics = Sheets.Spreadsheets.Values.get('myID', 'A6:U6');
var templateID = "myID"
for(var i = 0; i < tactics.values.length; i++){
var Timestamp = tactics.values[i][0];
var IDCFREF = tactics.values[i][2];
var raisedby = tactics.values[i][4];
var AccMan = tactics.values[i][6];
var Contrib = tactics.values[i][7];
var Contract = tactics.values[i][8];
var CompName = tactics.values[i][9];
var ValidFrom = tactics.values[i][10];
var ValidTo = tactics.values[i][11];
var Freq = tactics.values[i][12];
var PDetailFreq = tactics.values[i][13];
var BillType = tactics.values[i][14];
var TypeOfRebate = tactics.values[i][15];
var RebateDetails = tactics.values[i][16];
var RTarget = tactics.values[i][17];
var GiveDeets = tactics.values[i][19];
var WhyGiveRebate = tactics.values[i][20];
var documentID = DriveApp.getFileById(templateID).makeCopy().getId();
DriveApp.getFileById(documentID).setName('Rebate ' + IDCFREF + ' Request');
var body = DocumentApp.openById(documentID).getBody();
var header = DocumentApp.openById(documentID).getHeader();
header.replaceText('##IDCF##', IDCFREF)
body.replaceText('##REF##', IDCFREF)
body.replaceText('##RAISED##', raisedby)
body.replaceText('##ACCMAN##', AccMan)
body.replaceText('##CONTRIB##', Contrib)
body.replaceText('##SIGNED##', Contract)
body.replaceText('##NAME##', CompName)
body.replaceText('##FROM##', ValidFrom)
body.replaceText('##TO##', ValidTo)
body.replaceText('##FREQ##', Freq)
body.replaceText('##BESPOKE##', PDetailFreq)
body.replaceText('##BILL##', BillType)
body.replaceText('##TYPE##', TypeOfRebate)
body.replaceText('##DEETS##', RebateDetails)
body.replaceText('##TARGET##', RTarget)
body.replaceText('##FULL##', GiveDeets)
body.replaceText('##ELAB##', WhyGiveRebate)
}
}