Google Apps Script中基于发票号数组创建带id属性的发票对象
批量发票对象生成实现方案
核心逻辑为遍历去重后的发票号数组,从已拉取的全量发票明细中匹配同一发票号对应的公共属性,组装为标准发票对象即可。
代码实现与修正
核心发票对象组装函数
补全你现有代码中的fetchInvData函数,实现自动生成发票对象的能力:
function fetchInvData (invoiceIDs) { // 存储最终生成的所有发票对象,可根据后续使用场景选择数组或对象格式 const invoices = [] invoiceIDs.forEach(invId => { // 匹配当前发票号的第一条明细,提取公共字段(同一发票号的公共属性一致,取第一条即可) const matchedFirstLine = invoiceData.find(row => row[5] == invId) if(!matchedFirstLine) return // 组装发票对象,列索引根据你实际表格的字段顺序调整即可 const invoiceObj = { id: invId.toString(), // 发票号赋值给id属性,转字符串避免数字精度异常 invoiceDate: matchedFirstLine[1], // 示例:第2列为发票日期,修改为你实际的列索引 customerName: matchedFirstLine[3], // 示例:第4列为客户名称,修改为你实际的列索引 // 其他需要的发票公共属性都可在此处追加 lineItems: invoiceData.filter(row => row[5] == invId) // 存储该发票的所有商品明细行,后续生成发票直接使用 } invoices.push(invoiceObj) }) Logger.log(invoices) return invoices }
主逻辑修正
修正你printBulkInvoices函数中未生效的数组转换逻辑,调用组装函数即可拿到发票对象数组:
function printBulkInvoices() { logLineItems(); let todaysInvoices = uniqueInvIDs(); todaysInvoices.sort(); // 原map方法未赋值不会修改原数组,需主动接收返回值 todaysInvoices = todaysInvoices.map(String); // 调用函数拿到组装完成的发票对象数组 const invoiceObjs = fetchInvData(todaysInvoices); Logger.log(todaysInvoices); // 后续遍历invoiceObjs即可批量生成发票 }
JavaScript对象使用说明
- 追加属性:可以随时通过
对象名.属性名 = 属性值的方式为已生成的发票对象追加新属性,例如invoiceObj.taxAmount = 200 - 快速检索:如果需要通过发票号快速查询对应对象,可将存储结构改为键值对对象:
const invoices = {} // 遍历中用发票号作为键存储: invoices[invId] = invoiceObj // 后续查询直接用 invoices['35033817'] 即可拿到对应对象 - 明细处理:同一发票号的所有商品明细已存入
lineItems属性,生成发票时直接遍历该属性即可输出所有商品行
其他代码问题修复
你现有logTodaysInvoices函数写入表格时需要将一维数组转为二维数组,否则会报错:
function logTodaysInvoices (invIDArr){ const writeData = invIDArr.map(id => [id]) const targetSheet = invDataRepo.getSheetByName('invdata') targetSheet.getRange(targetSheet.getLastRow()+1,1,writeData.length,1).setValues(writeData); }
内容的提问来源于stack exchange,提问作者mohammadalha
相关产品推荐
相关产品推荐

