Google Script - 多个单元格从一个工作表复制到另一个工作表,“if empty”检查

时间:2016-12-10 06:37:35

标签: google-apps-script

首先,我要感谢Stack Overflow社区。 这里的很多帖子都有助于在Google电子表格中使用脚本构建结算数据文件,将发票转换为pdf,通过电子邮件发送,在生成pdf后清除发票的特定单元格等。

但是,我现在正在努力将销售数据从发票中导出到其他2张(销售和产品),以便能够进行一些分析

发票如下: Invoice 它可以包含1到10行不同的产品

以下是我的电子表格的链接:

https://docs.google.com/spreadsheets/d/11MDwYbCDHJy0rUtnYWEk4k8Ow0KvppNSu13B7uZWU1g/edit?usp=sharing

我想做什么:

  1. 对于“INVOICE”工作表的每个非空行,我想将特定单元格复制到包含以下信息的工作表“SALES”:Invoice #, Date, Name, Surname, Email, Ref, Product name, Quantity, Total price after rebate, Mode of payment
  2. 我想要售出1行/产品 因此,如果出售2个产品参考,我将不得不复制"Invoice #, Date, Name, Surname, Email and Mode of payment"两次

    我试过使用了几个函数(lastrow等),但这不是一个基本的副本(至少对我来说),因为我没有复制整行

    为了简单起见,我最终编写了一个复制发票10行的脚本(无论它们是否为空) 但是这给我带来了两个问题:我的脚本需要大约20秒才能运行,它会为没有销售数据的行复制Invoice #, Date, Name,... 然后我必须手动删除这些行。如果我创建一个脚本来删除这些行,那就更慢了

    1. 在销售表中,我有Vlookup公式(黄色列),我想在创建新行或在新行中添加数据时将其复制下来 再一次,我不能那样做

    2. 在“产品”表中,每次销售产品时调整库存数量 为此,我创建了一个专栏“Sold qtties”(E栏),我希望通过发票中出售的qtties增加

    3. 如果有人能在这里帮助我,我真的很感激。

1 个答案:

答案 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]);
           }
       }

     }
  }

}

如果所有工作都符合预期,您可以直接在电子表格中进行测试

相关问题