Google Apps Script PDF打印适配纯数字发票号问题
解决纯数字发票号与代码类型不匹配的打印问题
问题核心是类型不匹配:用户输入的发票号是字符串格式(比如"1"),而数据库中读取的纯数字是Number类型(比如1),两者用includes()对比时会判定为不相等,导致无法匹配到目标发票。
解决方案:统一数据类型
有两种可行的修改方向,任选其一即可:
方向1:将用户输入的字符串转为数字
修改promptUserToSelectInvoices函数中处理输入的部分,把分割后的字符串转为数字类型,同时过滤无效输入:
function promptUserToSelectInvoices(data) { var selectedInvoices = []; var ui = SpreadsheetApp.getUi(); var response = ui.prompt('Select Invoices to Print', 'Enter the invoice numbers separated by commas:', ui.ButtonSet.OK_CANCEL); if (response.getSelectedButton() === ui.Button.OK) { var input = response.getResponseText().trim(); Logger.log(input) selectedInvoices = input.split(',').map(function(value) { // 去除空格并转为数字,非数字输入转为null var num = Number(value.trim()); return isNaN(num) ? null : num; }).filter(Boolean); // 过滤掉无效的非数字项 if (selectedInvoices.length > 0) { PrintSelectedToPDF(selectedInvoices); } else { ui.alert('请输入有效的纯数字发票号,用逗号分隔'); } } }
方向2:将数据库读取的数字转为字符串
修改PrintSelectedToPDF函数中读取数据库值的部分,把数字转为字符串:
function PrintSelectedToPDF(invoicesToPrint) { var spreadsheet = SpreadsheetApp.getActive(); var databaseSheet = spreadsheet.getSheetByName('Database'); var invoiceSheet = spreadsheet.getSheetByName('Invoice'); var dataRange = databaseSheet.getRange(3, 12, databaseSheet.getLastRow() -2, 1); var data = dataRange.getValues(); for (var i = 0; i < data.length; i++) { // 将数据库中的数字转为字符串,和用户输入的格式统一 var valueToPrint = String(data[i][0]); Logger.log(valueToPrint); // 现在类型一致,includes可以正确匹配 if (invoicesToPrint.length === 0 || invoicesToPrint.includes(valueToPrint)) { invoiceSheet.getRange('Q7').setValue(valueToPrint); var url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId() + '/export?'; var params = { exportFormat: 'pdf', format: 'pdf', size: 'letter', portrait: 'true', fitw: 'true', sheetnames: 'false', printtitle: 'false', top_margin: 0, bottom_margin: 0, left_margin: 0, right_margin: 0, gid: invoiceSheet.getSheetId() }; var ss = SpreadsheetApp.getActiveSpreadsheet(); var range = ss.getRange("invoice!A1:V41"); var rangeParam = '&range=' + range.getA1Notation(); url += getUrlParams(params) + rangeParam; var backoffTime = 500; var maxBackoffTime = 5000; var attempts = 0; var response; // 剩余PDF导出逻辑继续... } } }
额外提示
- 如果选择方向1,建议保留输入验证逻辑,避免用户输入非数字内容导致后续出错。
- 确保
getUrlParams函数能正常处理参数拼接,这是PDF导出的关键步骤。
内容的提问来源于stack exchange,提问作者Luis Fernando Álvarez Hernández
相关产品推荐
相关产品推荐

