问题描述
我刚接触编码,但是我已经能够编写一个脚本,该脚本将从电子表格中获取信息并将其转换为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);
}
注意:
- 定义了
checkedColumnIndex
和check
,以便以后更容易更改。 - 因为您使用的是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);
}```