mohammadalha
mohammadalha

Reputation: 19

Use array of invoice numbers to create invoice objects within which each invoice number from the initial array serves as id property

Building a script in google apps script.

Below is a screenshot of a simplified version of my order sheet:

This is a clipping of my order sheet. Before and after the shown columns there are many more with more details but the hierarchies of information are already in the image

enter image description here

Below is the code I have so far:

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);
}

Upvotes: 1

Views: 762

Answers (1)

Cooper
Cooper

Reputation: 64040

It's hard to say exactly what you need since we cannot see your Invoice Data Sheet. But here's something that might give you a start:

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
  }
});

To follow up from your question:

Your loop to collect object data would start to look something like this:

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:'' });
    }
  });

}

Upvotes: 2

Related Questions