停止脚本创建 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);
}
备注:
- 已定义
checkedColumnIndex
和 check
,以便以后更容易更改。
- 因为您使用的是 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);
}```
我是编码方面的新手,但我已经能够编写一个脚本,从电子表格中获取信息并将其转换为 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);
}
备注:
- 已定义
checkedColumnIndex
和check
,以便以后更容易更改。 - 因为您使用的是 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);
}```