我想将名称及其成本复制到另一个选项卡,然后计算所有类似项目的总成本。 我的脚本逻辑是将每个值与之前复制的值进行比较,如果不同,则输出应为“总计”,但如果相同,则应复制“名称”。 (我基本上想逐行,逐个值地复制数据,以便我可以根据某些条件来确定是否应该进行复制。
到目前为止我编写的脚本仅用于将名称复制到目标工作表,但即使这样对我也不起作用。我的知识显然有限,如果有人能提供帮助,那就太好了!
这是我正在使用的 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");
}
}
}
}
答案 0 :(得分:0)
您可以执行以下操作:
Names
列对源数据进行排序。destData
,该数组将用于将数据复制到目标。Name
对应的最后一行),或者如果没有下一行(也就是说,它是该行的最后一行)源数据),使用 filter 和 reduce 计算此名称的 Total
,然后将该总数推入 destData
。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);
}