将数据复制到另一个工作表并计算总计

时间:2021-07-02 12:20:49

标签: javascript google-apps-script google-sheets

我想将名称及其成本复制到另一个选项卡,然后计算所有类似项目的总成本。 我的脚本逻辑是将每个值与之前复制的值进行比较,如果不同,则输出应为“总计”,但如果相同,则应复制“名称”。 (我基本上想逐行,逐个值地复制数据,以便我可以根据某些条件来确定是否应该进行复制。

到目前为止我编写的脚本仅用于将名称复制到目标工作表,但即使这样对我也不起作用。我的知识显然有限,如果有人能提供帮助,那就太好了!

这是我正在使用的 doc,如果有人想参考的话。

为无法访问的人附上图片:

源数据:

我希望目标表的外观

function myFunction() {
  Copy();
}

function Copy() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ts = ss.getSheetByName("Total");
 
  for (var n=1;n<10;n++) {
    
    var namesSourceRange = ss.getSheetByName("Breakdown").getRange(1,2,n,1);
    var namesTargetRange = ss.getSheetByName("Total").getRange(1,2,n,1);
    var sourceNames = namesSourceRange.getValues();
    var targetNames = namesTargetRange.getValues();
    
    if (n=1){
    namesTargetRange.setValues(sourceNames);
    }
    else{
    if (sourceNames[n] === targetNames[n-1]){
     namesTargetRange.setValues(sourceNames);
    }
    else {
     namesTargetRange.setValue("Total");
    }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

  • 使用 sort 根据 Names 列对源数据进行排序。
  • 循环访问源数据,例如,使用 forEach。将每一行值推送到另一个数组 destData,该数组将用于将数据复制到目标。
  • 如果该行的名称与下一行的名称不同(即是该 Name 对应的最后一行),或者如果没有下一行(也就是说,它是该行的最后一行)源数据),使用 filterreduce 计算此名称的 Total,然后将该总数推入 destData
  • 使用 setValues(values)destData 复制到目标工作表。

代码示例:

function Copy() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ts = ss.getSheetByName("Totals");
  var sourceSheet = ss.getSheetByName("Breakdown");
  var sourceData = sourceSheet.getRange(2,2,sourceSheet.getLastRow()-1,2).getValues();
  sourceData.sort((a,b) => {
    if (a[0] < b[0]) return 1;
    else return -1;
  });
  const destData = [["Names", "Cost"]];
  sourceData.forEach((row, i) => {
    destData.push(row);
    if (sourceData.length === i + 1 || row[0] !== sourceData[i+1][0]) {
      const total = sourceData.filter(rowData => rowData[0] === row[0]).map(row => row[1]).reduce((acc,current) => acc+current);
      destData.push(["Total", total], ["", ""])
    }
  });
  ts.getRange(1,2,destData.length, destData[0].length).setValues(destData);
}
相关问题