停止脚本创建 PDF 副本

Stop script from creating PDF duplicates

我是编码方面的新手,但我已经能够编写一个脚本,从电子表格中获取信息并将其转换为 PDF。我现在遇到的麻烦是试图找到一种方法让代码在每次 运行 代码创建重复之前停止。我尝试了一个 try catch 块,return,throw 和 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,RemittanceInfo.getLastRow()-1,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,13,RemittanceInfo.getLastRow()-1,1).setValues(Print);  
}

function createPDF(Vendor,Street,City,Prov,PostalCode,DatePaid,Account,Invoice,AmountDue,Chq,Memo,pdfName,docFile,tempFolder,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,RemittanceInfo.getLastRow()-1,1).setValues(Print);  
}

备注:

  • 已定义 checkedColumnIndexcheck,以便以后更容易更改。
  • 因为您使用的是 getDisplayValues(),,所以复选框返回的值是字符串“TRUE”或“FALSE”(case-sensitive)。值得庆幸的是,字符串“TRUE”将被正确解释为复选框——无需传递布尔值。
  • 不使用箭头函数只是因为它弄乱了 Apps 脚本编辑器中的格式。
  • 即使跳过 PDF 创建也将值推送到 Print,否则检查将不会与正确的行相对应。
  • 打印回 sheet 时,请记住偏移 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,1,RemittanceInfo.getLastRow()-1,13).getDisplayValues();
  const addCheckbox = RemittanceInfo.getRange(2,13,RemittanceInfo.getLastRow()-1,1).insertCheckboxes();
  const checkedColumnIndex = 13;
  const check = "TRUE";
  let Print = [];
  
   data.forEach(function(row) {
     if(row[checkedColumnIndex-1] !== 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]+" "+row[9]+" Inv "+row[6],docFile,tempFolder,pdfFolder);
    }
    Print.push([check]);
  });
  RemittanceInfo.getRange(2,checkedColumnIndex,RemittanceInfo.getLastRow()-1,1).setValues(Print);
}

function createPDF(Vendor,Street,City,Prov,PostalCode,DatePaid,Account,Invoice,AmountDue,Chq,Memo,pdfName,docFile,tempFolder,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);
}```