阻止脚本创建PDF副本

问题描述

我刚接触编码,但是我已经能够编写一个脚本,该脚本将从电子表格中获取信息并将其转换为PDF。我现在遇到的麻烦是试图找到一种方法,使每次我运行代码时,在创建重复项之前停止代码。我已经尝试了try catch块,返回,抛出和if else语句,但我只是不明白。我花了很多时间寻找是否可以找到解决方案,但似乎无法解决

function createBulkPDFs(){
  
  const docFile = DriveApp.getFileById(//myfileID);
  const tempFolder = DriveApp.getFolderById(//myfolderID);
  const pdfFolder = DriveApp.getFolderById(//myfolderID);
  const RemittanceInfo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Query");
   const data = RemittanceInfo.getRange(2,1,RemittanceInfo.getLastRow()-1,13).getdisplayValues();
  const checkedColumnIndex = 12;
  const addCheckBox = RemittanceInfo.getRange(2,13,1).insertCheckBoxes();
  const check = "TRUE";
  let Print = [];
  
   data.forEach(function(row) {
     if (row[checkedColumnIndex] = check) {
         return;
         }
     else if (row[checkedColumnIndex] !== check){
       return addCheckBox
     }
    else  (row[checkedColumnIndex] !== check){
      return createPDF(row[0],row[1],row[2],row[3],row[4],row[9],row[5],row[6],row[7],row[8],row[11],row[0]+" "+row[9]+" Inv "+row[6],docFile,tempFolder,pdfFolder);
    }
    Print.push([check]);
  });
  RemittanceInfo.getRange(2,1).setValues(Print);  
}

function createPDF(vendor,Street,City,Prov,PostalCode,DatePaid,Account,Invoice,AmountDue,Chq,Memo,pdfName,pdfFolder) {
 
  const tempFile = docFile.makecopy(tempFolder);
  const tempDocFile = DocumentApp.openById(tempFile.getId());
  const body = tempDocFile.getBody();
  body.replaceText("{vendor}",vendor);
  body.replaceText("{Street}",Street);
  body.replaceText("{City}",City);
  body.replaceText("{Prov}",Prov);
  body.replaceText("{PostalCode}",PostalCode);
  body.replaceText("{DatePaid}",DatePaid);
  body.replaceText("{Account}",Account);
  body.replaceText("{Invoice}",Invoice);
  body.replaceText("{AmountDue}",AmountDue);
  body.replaceText("{Chq}",Chq);
  body.replaceText("{Memo}",Memo);
  tempDocFile.saveAndClose();
  const PDFContentBlob = tempFile.getAs(MimeType.PDF);
  pdfFolder.createFile(PDFContentBlob).setName(pdfName);
  tempFolder.removeFile(tempFile);
}

真的很感谢您的帮助。

解决方法

这是在复制PDF,因为您已经运行了脚本,因此实际上没有任何错误,因此try...catch不会执行您期望的操作。

由于您正在选中N列中的框以指示已创建PDF,因此只需查看运行脚本时是否已选中该框即可。如果未选中,则创建PDF。

function createBulkPDFs(){
  const docFile = DriveApp.getFileById(//myfileID);
  const tempFolder = DriveApp.getFolderById(//myfolderID);
  const pdfFolder = DriveApp.getFolderById(//myfolderID);
  const RemittanceInfo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Query");
  const data = RemittanceInfo.getRange(2,1,RemittanceInfo.getLastRow()-1,14).getDisplayValues();
  const checkedColumnIndex = 13;
  const check = "TRUE";
  
  let Print = [];
  data.forEach(function(row) {
    if (row[checkedColumnIndex] !== check) {
      createPDF(row[0],row[1],row[2],row[3],row[4],row[9],row[5],row[6],row[7],row[8],row[11],row[0]+" Inv "+row[6]+" - "+row[9],docFile,tempFolder,pdfFolder);
    }
    Print.push([check]);
  });
  
  RemittanceInfo.getRange(2,checkedColumnIndex+1,1).setValues(Print);  
}

注意:

  • 定义了checkedColumnIndexcheck,以便以后更容易更改。
  • 因为您使用的是getDisplayValues(),,所以复选框返回的值是字符串“ TRUE”或“ FALSE”(区分大小写)。幸运的是,字符串“ TRUE”将被正确解释为一个复选框-无需传递布尔值。
  • 不仅仅使用箭头功能是因为它弄乱了Apps脚本编辑器中的格式。
  • 即使跳过PDF创建,也将值推入Print,因为否则检查将与正确的行不符。
  • 在打印回到工作表时,请记住要使checkedColumnIndex偏移,因为数组的索引是0,但是ranges are 1-indexed
,

睡了几天后,我得以弄清楚我的问题。以下代码可用于创建PDF的单个副本,并且仅生成一个副本。谢谢您对迭戈的所有帮助!

  
  const docFile = DriveApp.getFileById(" template ID ");
  const tempFolder = DriveApp.getFolderById(" temp folder ID ");
  const pdfFolder = DriveApp.getFolderById(" PDF fold ID ");
  const RemittanceInfo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Query");
  const data = RemittanceInfo.getRange(2,13).getDisplayValues();
  const addCheckbox = RemittanceInfo.getRange(2,13,1).insertCheckboxes();
  const checkedColumnIndex = 13;
  const check = "TRUE";
  let Print = [];
  
   data.forEach(function(row) {
     if(row[checkedColumnIndex-1] !== check) {
       createPDF(row[0],row[0]+" "+row[9]+" Inv "+row[6],pdfFolder);
    }
    Print.push([check]);
  });
  RemittanceInfo.getRange(2,checkedColumnIndex,1).setValues(Print);
}

function createPDF(Vendor,Street,City,Prov,PostalCode,DatePaid,Account,Invoice,AmountDue,Chq,Memo,pdfName,pdfFolder) {
 
  const tempFile = docFile.makeCopy(tempFolder);
  const tempDocFile = DocumentApp.openById(tempFile.getId());
  const body = tempDocFile.getBody();
  body.replaceText("{Vendor}",Vendor);
  body.replaceText("{Street}",Street);
  body.replaceText("{City}",City);
  body.replaceText("{Prov}",Prov);
  body.replaceText("{PostalCode}",PostalCode);
  body.replaceText("{DatePaid}",DatePaid);
  body.replaceText("{Account}",Account);
  body.replaceText("{Invoice}",Invoice);
  body.replaceText("{AmountDue}",AmountDue);
  body.replaceText("{Chq}",Chq);
  body.replaceText("{Memo}",Memo);
  tempDocFile.saveAndClose();
  const PDFContentBlob = tempFile.getAs(MimeType.PDF);
  pdfFolder.createFile(PDFContentBlob).setName(pdfName);
  tempFolder.removeFile(tempFile);
}```