首先,我要感谢Stack Overflow社区。 这里的很多帖子都有助于在Google电子表格中使用脚本构建结算数据文件,将发票转换为pdf,通过电子邮件发送,在生成pdf后清除发票的特定单元格等。
但是,我现在正在努力将销售数据从发票中导出到其他2张(销售和产品),以便能够进行一些分析
发票如下: Invoice 它可以包含1到10行不同的产品
以下是我的电子表格的链接:
https://docs.google.com/spreadsheets/d/11MDwYbCDHJy0rUtnYWEk4k8Ow0KvppNSu13B7uZWU1g/edit?usp=sharing
我想做什么:
Invoice #, Date, Name, Surname, Email, Ref, Product name, Quantity, Total price after rebate, Mode of payment
我想要售出1行/产品
因此,如果出售2个产品参考,我将不得不复制"Invoice #, Date, Name, Surname, Email and Mode of payment"
两次
我试过使用了几个函数(lastrow等),但这不是一个基本的副本(至少对我来说),因为我没有复制整行
为了简单起见,我最终编写了一个复制发票10行的脚本(无论它们是否为空)
但是这给我带来了两个问题:我的脚本需要大约20秒才能运行,它会为没有销售数据的行复制Invoice #, Date, Name,...
然后我必须手动删除这些行。如果我创建一个脚本来删除这些行,那就更慢了
在销售表中,我有Vlookup公式(黄色列),我想在创建新行或在新行中添加数据时将其复制下来 再一次,我不能那样做
在“产品”表中,每次销售产品时调整库存数量 为此,我创建了一个专栏“Sold qtties”(E栏),我希望通过发票中出售的qtties增加
如果有人能在这里帮助我,我真的很感激。
答案 0 :(得分:2)
您的代码非常慢,因为您处理单个数据而不是倍数。 另外,对于您的公式问题,我使用ARRAYFORMULA
更改它们以下是您修改后的代码:
function myFunction() {
var sourceSpreadsheet = SpreadsheetApp.getActive();
var sheetName = "INVOICE";
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
// Copy each sales lines to 'SALES' sheet
var destinSheet = "SALES";
var cibleSheet = sourceSpreadsheet.getSheetByName(destinSheet);
var cibleSheetRange = sourceSpreadsheet.getSheetByName(destinSheet);
//DEBUT MODIFS
var sourceSheetData = sourceSheet.getRange("A13:H22").getValues();
var numInvoice = sourceSheet.getRange("F2").getValue();
var dateInvoice = sourceSheet.getRange("F3").getValue();
var typePaiement = sourceSheet.getRange("C26").getValue();
var surName = sourceSheet.getRange("F7").getValue();
var lastName = sourceSheet.getRange("F8").getValue();
var email = sourceSheet.getRange("F9").getValue();
var invoiceLine1 = [];
var invoiceLine2 = [];
var invoiceLine3 = [];
var lines =0;
var lastRow = cibleSheet.getLastRow();
for(var i=0;i<sourceSheetData.length;i++){
if(sourceSheetData[i][0]!=""){
lines= lines+1;
cibleSheet.getRange(lastRow+lines,1 ,1,2).setValues([[numInvoice,dateInvoice]]);
cibleSheet.getRange(lastRow+lines,5 ,1,5).setValues([[surName,lastName,email,sourceSheetData[i][1],sourceSheetData[i][2]]]);
cibleSheet.getRange(lastRow+lines,11 ,1,3).setValues([[sourceSheetData[i][0],sourceSheetData[i][7],typePaiement]]);
//INCREMENT STOCK
//YOU ALSO COULD USE FORMULA =sumifs(SALES!K:K;SALES!I:I;C2;SALES!J:J;B2)
for (var j=0;j<stockSheetData.length;j++){
if (sourceSheetData[i][1]==stockSheetData[j][0]){
var oldSales= stockSheet.getRange(j+1,5).getValue();
stockSheet.getRange(j+1,5).setValue(oldSales+sourceSheetData[i][0]);
}
}
}
}
}
如果所有工作都符合预期,您可以直接在电子表格中进行测试