Попытка остановить запуск моей функции слияния почты из строки 2 при каждом добавлении новой строки

#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 — нет.