首页 > 解决方案 > 使用发票编号数组创建发票对象,其中初始数组中的每个发票编号都用作 id 属性

问题描述

在谷歌应用脚​​本中构建脚本。

下面是我的订单表的简化版本的屏幕截图:

这是我的订单的剪报。在显示的列之前和之后,还有更多详细信息,但信息的层次结构已经在图像中

在此处输入图像描述

以下是我到目前为止的代码:

const orderSheet = SpreadsheetApp.openById('SPREADSHEETID').getSheetByName('SHEETNAME');
const invoiceTemplate = DriveApp.getFileById('DOCUMENTID');
const tempFolder = DriveApp.getFolderById('FOLDERID');
const invoiceData = orderSheet.getRange(4,7, orderSheet.getLastRow() - 1, 57).getDisplayValues().filter(function (rows){ return rows[0] === 'INVOICED'});
const invDataRepo = SpreadsheetApp.openById('SPREADSHEETID2');
var timestamp = new Date();

function printBulkInvoices() {
  logLineItems ();
  var todaysInvoices = uniqueInvIDs ();
  todaysInvoices.sort();
  todaysInvoices.map(String);
  //fetchInvData (todaysInvoices);
  Logger.log (todaysInvoices)


}



function fetchInvData (invoiceIDs) {

let invoices = {
}
Logger.log(invoices)
  invoiceIDs.forEach
}


function fetchLineItems (invoiceDataArray) {
}

// send array of todays unique invoice numbers (later all inv data?) to invdata sheet and log them
function logTodaysInvoices (invIDArr){
invIDArr.forEach
  invDataRepo.getSheetByName('invdata').getRange(invDataRepo.getSheetByName('invdata').getLastRow()+1,1,invIDArr.length,1).setValue(invIDArr);
}

// return an array of unique invoice ids from todays invoice data
function uniqueInvIDs (){
  let singleArray = invoiceData.map(row => row[5]);
  let unique = [...new Set(singleArray)];
  return unique;
}

  //log incoicedata to invdatarepo-sheet 'lineitems'
function logLineItems (){
invDataRepo.getSheetByName('lineitems').getRange(invDataRepo.getSheetByName('lineitems').getLastRow()+1,2,invoiceData.length,invoiceData[0].length).setValues(invoiceData);
}

标签: javascriptgoogle-apps-scriptgoogle-sheetsgoogle-drive-apijavascript-objects

解决方案


由于我们看不到您的发票数据表,因此很难准确说出您需要什么。但这里有一些可能会让你开始:

let iobj = {idA:[]};
[35033817, 35033818, 35033819, 35033820, 35033821].forEach((id => {
  if(!iobj.hasOwnProperty(id)) {
    iobj[id]={date: invoiceDate, name: customName, items:[]};
    iobj.idA.push(id);//I find it handy to have an array of object properties to loop through when I wish to reorganize the data after it's all collected
  } else {
    iobj[id].items.push({item info properties});//I am guessing here that you may wish to addition additional information about the items which are on the current invoice
  }
});

要跟进您的问题:

您收集对象数据的循环将开始如下所示:

function getInvoiceData() {
  const ss = SpreadsheetApp.getActive();
  const ish = ss.getSheetByName('Invoice Data');
  const isr = 2;
  const hA = ish.getRange(1, 1, 1, ish.getLastColumn()).getValues()[0];
  let idx = {};//object return head index into row array based on header title which in this case I assume invoice number is labeled 'Invoicenumber'
  hA.forEach((h, i) => {idx[h] = i});
  const vs = ish.getRange(isr, 1, ish.getLastRow() - isr + 1, ish.getLastColumn()).getValues();
  let iobj = { idA: [] };
  vs.forEach(r => {
    if (!iobj.hasOwnProperty(r[idx['invoicenumber']])) {
      iobj[r[idx['invoicenumber']]] = { date: r[idx['invoicedate']], name: r[idx['customername']], items: [] };
      iobj.idA.push(r[idx['invoicenumber']]);
    } else {
      iobj[r[idx['invoicenumber']]].items.push({ iteminfoproperties:'' });
    }
  });

}

推荐阅读