#google-apps-script #google-sheets #mailmerge
#google-apps-script #google-sheets #mailmerge
Вопрос:
Как говорится в названии:
Каждый раз, когда добавляется новая строка, программа должна запускать только последнюю вставленную строку, потому что я использую строку «Success», чтобы остановить запуск уже объединенной строки.
Как мне убедиться, что он запускает или объединяет только недавно вставленную строку, не начиная со строки 2 при каждом запуске функции? Несмотря на то, что я добавил в свой код строку «Success», чтобы она ее увидела и пропустила эту строку.
Ниже приведен мой код:
var Success = "Success";
function createBulkPDFs()
{
const pdfFolder = DriveApp.getFolderById("1_jdFncxgkyCuH181MpwyYf25gWrWHMO");
const docFile = DriveApp.getFileById("1XAn-1MqH6ER01dnbATLzG9gYWQpFDKfQhUwWHRRcyo");
const tempFolder = DriveApp.getFolderById("141fjXWkg0fU3q0u22WUPkJDl82JakTj");
const currentSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
const data = currentSheet.getRange(2, 1, currentSheet.getLastRow() - 1, 32).getDisplayValues();
let errors = [];
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
for (var i = 2; i <= lr; i )
{
var check = ss.getRange(i, 33).getValue();
if (check != Success)
{
data.forEach(row =>
{
try
{
createPDF(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9],
row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18],
row[19], row[20], row[21], row[22], row[23], row[24], row[25], row[26], row[27],
row[28], row[29], row[30], row[31], row[3], docFile, tempFolder, pdfFolder);
errors.push(["Success"]);
}
catch (err)
{
errors.push(["Failed"]);
}
}); //close forEach
currentSheet.getRange(2, 33, currentSheet.getLastRow() - 1, 1).setValues(errors);
}
}
}
function createPDF(RepTime, Rep_Name, RepIC_No, Ven_Company, RepDs, Ven_Comp_Regis, Ven_Cont_no, Ven_Fax_no, Ven_Add,
PODquestionone, PODquestiontwo, PODquestionthree, PODquestionfour, PODquestionfive, PODquestionsix, RPOquestionone,
RPOquestiontwo, RPOquestionthree, RPOquestionfour, RPOquestionfive, RPOquestionsix, RPOquestionseven,
CIACquestionone, CIACquestiontwo, Prepquestionone, MACCquestionone, MACCquestiontwo, MACCquestionthree,
MACCquestionfour, WCquestionone, WCquestiontwo, WCquestionthree, pdfName, docFile, tempFolder, pdfFolder)
{
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lr = ss.getLastRow();
//for(var i = 2; i<=lr; i ){
var checks = ss.getRange(i, 33).getValue();
//var che = ss.getRange(i,1).getValue();
//if(checks != ""){
const tempFile = docFile.makeCopy(tempFolder);
const tempDocFile = DocumentApp.openById(tempFile.getId());
const body = tempDocFile.getBody();
body.replaceText("{RepTime}", RepTime);
body.replaceText("{RepFullName}", Rep_Name);
body.replaceText("{RepICNo}", RepIC_No);
body.replaceText("{VCompany}", Ven_Company);
body.replaceText("{RepDesig}", RepDs);
body.replaceText("{VCompanyRegis}", Ven_Comp_Regis);
body.replaceText("{VConNo}", Ven_Cont_no);
body.replaceText("{VFaxNo}", Ven_Fax_no);
body.replaceText("{VAddress}", Ven_Add);
body.replaceText("{PODQuestionone}", PODquestionone);
body.replaceText("{PODQuestiontwo}", PODquestiontwo);
body.replaceText("{PODQuestionthree}", PODquestionthree);
body.replaceText("{PODQuestionfour}", PODquestionfour);
body.replaceText("{PODQuestionfive}", PODquestionfive);
body.replaceText("{PODQuestionsix}", PODquestionsix);
body.replaceText("{RPOQuestionone}", RPOquestionone);
body.replaceText("{RPOQuestiontwo}", RPOquestiontwo);
body.replaceText("{RPOQuestionthree}", RPOquestionthree);
body.replaceText("{RPOQuestionfour}", RPOquestionfour);
body.replaceText("{RPOQuestionfive}", RPOquestionfive);
body.replaceText("{RPOQuestionsix}", RPOquestionsix);
body.replaceText("{RPOQuestionseven}", RPOquestionseven);
body.replaceText("{CIACQuestionone}", CIACquestionone);
body.replaceText("{CIACQuestiontwo}", CIACquestiontwo);
body.replaceText("{PrepQuestionone}", Prepquestionone);
body.replaceText("{MACCQuestionone}", MACCquestionone);
body.replaceText("{MACCQuestiontwo}", MACCquestiontwo);
body.replaceText("{MACCQuestionthree}", MACCquestionthree);
body.replaceText("{MACCQuestionfour}", MACCquestionfour);
body.replaceText("{WCQuestionone}", WCquestionone);
body.replaceText("{WCQuestiontwo}", WCquestiontwo);
body.replaceText("{WCQuestionthree}", WCquestionthree);
tempDocFile.saveAndClose();
const pdfContentBlob = tempFile.getAs(MimeType.PDF);
const pdfFile = pdfFolder.createFile(pdfContentBlob).setName(pdfName);
tempFolder.removeFile(tempFile);
}
Комментарии:
1. Всегда ли последняя строка вставляется в нижней части листа (добавляется)? Вы запускаете скрипт вручную или при запуске (какой?)?
2. @ziganotschka, да, последняя версия всегда вставляется в нижней части листа. Скрипт запускается при запуске (отправке формы), но для теста я запускаю его вручную, чтобы посмотреть, увидит ли он строку «Success» и пропустит эту строку и выполнит слияние только для вновь вставленной в последней строке .. но каждый тест возвращает тот же результат, при этом более ранние строки воссоздаются и объединяются сновахотя это было сделано ранее и установлено «Успех».
Ответ №1:
Очень вероятным объяснением if (check != Success)
возврата false является то, что активный лист ss
отличается от аналогичного currentSheet
.
Вы можете избежать подобных ошибок, пропустив activate()
getActiveSheet()
запросы и — вместо этого извлекайте интересующий вас лист всегда по имени.
Теперь, если вы используете триггер отправки формы, вы можете реструктурировать свой код более элегантным способом, используя объекты событий.
- Объект события formSubmit позволяет напрямую извлекать всю соответствующую информацию, относящуюся к последнему ответу формы, то есть значения ответа и диапазон, в котором этот ответ формы был вставлен в лист.
- Вам не нужно перебирать весь лист, чтобы найти правильную строку.
Образец для запуска в триггере formSubmit:
const pdfFolder = DriveApp.getFolderById("1_jdFncxgkyCuH181MpwyYf25gWrWHMO");
const docFile = DriveApp.getFileById("1XAn-1MqH6ER01dnbATLzG9gYWQpFDKfQhUwWHRRcyo");
const tempFolder = DriveApp.getFolderById("141fjXWkg0fU3q0u22WUPkJDl82JakTj");
function createBulkPDFs(event)
{
let error;
var row = event.values;
// have a look at the values:
Logger.log(row);
try {
createPDF(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20], row[21], row[22], row[23], row[24], row[25], row[26], row[27],row[28], row[29], row[30], row[31], row[3], docFile, tempFolder, pdfFolder);
error = "Success";
} catch (err){
error="Failed";
}
var row = event.range.getRow();
var currentSheet = event.range.getSheet();
currentSheet.getRange(row, 33).setValue(error);
}
function createPDF(...){
...
}
При использовании функций с объектами событий имейте в виду, что они могут быть вызваны только событием (отправка формы) — если вы попытаетесь запустить функцию вручную — это приведет к ошибке, поскольку объект события не будет определен.
Комментарии:
1. Привет @ ziganotschka, спасибо за объяснение. Использование события работает как шарм. Для строки «Success» я использовал следующее: SpreadsheetApp.getActiveSpreadsheet().getSheetByName(«Sheet1»);//.activate(); var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(«Sheet1»); var lr = ss.getLastRow(); для (vari = 2; i <= lr; i ) { var check = ss.getRange(i, 33).GetValue(); } if (check != Success) { console.log(check); let errors = []; Он по-прежнему не пропускает ранее установленную строку успеха.
2. Вот ссылка на мой лист. docs.google.com/spreadsheets/d /…
3. Я думаю, проблема в том, что ваше
if
утверждение не находится внутриfor
цикла. попробуйте выполнить следующее:for (var i = 2; i <= lr; i ) { var check = ss.getRange(i, 33).getValue(); console.log(ss.getRange(i, 33).getA1Notation()); console.log(check); if (check != Success) { console.log("check is not success"); } }
4. Спасибо. Я только что попробовал. но все еще возникает та же проблема. Вот журнал: [20-10-01 16:39:39:941 HKT] AG2 [20-10-01 16:39:39:943 HKT] Успех [20-10-01 16:39:39:953 HKT] AG3 [20-10-01 16:39:39:955 HKT] [20-10-01 16:39:39:957 HKT] проверка не удалась
5. Для меня это звучит правильно — ведь ячейка
AG2
вашего образца листа содержит значениеSuccess
, а ячейкаAG3
— нет.