Google Apps脚本-获取参数中给定单元格的单元格偏移量值



我在这方面花了一些时间,但找不到我想要的答案。我正在写一个成本计算器,不是每个人都贡献了每一笔成本。我使用一个复选框来计算一个人是否是给定成本的贡献者,最后有一个公式,它接受不确定数量的参数(在JS中使用arguments(,并将所有复选框相加,并添加到给定个人的总和中。您将在下面看到我的意思,包括屏幕截图、代码片段和我的gSheet。我想弄清楚的是,如果选中了一个参数(复选框(,则将来自不同行但相同列的不同单元格的值添加到我的总和中,作为我的复选框。

如果我直接在单元格中编写脚本,我可以使用INDIRECT语法,但我尝试使用GAS并调用if函数,因此我可以添加if(checkbox(then语句。感谢您的帮助。

如果你能帮我弄清楚语法,我就不用把每个单元格的值都作为逗号分隔的参数来添加,而是把一个范围作为参数数组来添加,这将是一个加分项。

请看下面,看看你是否能帮我弄清楚我在找什么语法。

纸张的屏幕截图

链接到此处的工作表

代码:

function addIt() {
for (let i = 0; i < arguments.length; i++) {
var sum = 0;
//this is where I want to add a 'perPerson' that is a value offset from the the cell position of a given argument
//var perPerson = [?????]
if (arguments[i] == true) {
sum += perPerson;
}
}
return sum;
}

在您的情况下,下面的示例脚本如何?

示例脚本1:

在该样品中,请将=addIt(B3:G3)放入一个细胞中;H3";。通过这种方式,该值被放入单元格"0";H3";。

function addIt(values) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var v = sheet.getRange("B10:G10").getValues()[0];
return values[0].reduce((s, c, i) => s += c == true ? v[i] : 0, 0);
}

示例脚本2:

在该样品中,请将=addIt(B3:G8)放入一个细胞中;H3";。通过这种方式,值被放入单元格"0";H3:H8";。

function addIt(values) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var v = sheet.getRange("B10:G10").getValues()[0];
return values.map(r => r.reduce((s, c, j) => s += c == true ? v[j] : 0, 0));
}

参考文献:

  • reduce((
  • 映射((

不使用任何单元格函数的总计

function grandTotals() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet0');
const sr = 3;
const ihA = sh.getRange(1, 1, 1, sh.getLastColumn()).getValues().flat();
const chA = sh.getRange(2, 1, 1, sh.getLastColumn()).getValues().flat();
const vs = sh.getRange(sr, 1, sh.getLastRow() - sr + 1, sh.getLastColumn()).getDisplayValues();
let imidx = {};
ihA.forEach((h, i) => { imidx[h] = i; });
let csidx = {};
chA.forEach((h, i) => { csidx[h] = i; })
let gt = { pA: [], iA: [] };
//collecting cell data
vs.forEach((r, i) => {
r.forEach((c, j) => {
if (j > 0) {
if (c == "TRUE") {
if (!gt.hasOwnProperty(r[0])) {
gt[r[0]] = [];
gt[r[0]].push({ item: ihA[j], cost: chA[j] })
gt.pA.push(r[0]);
} else {
gt[r[0]].push({ item: ihA[j], cost: chA[j] })
}
if (!gt.hasOwnProperty(ihA[j])) {
gt[ihA[j]] = { cost: chA[j], count: 1 };
gt.iA.push(ihA[j])
} else {
gt[ihA[j]].count += 1;
}
}
}
});
});
//calculating grand totals
let g =  gt.pA.map(p => {
return [p,parseInt(gt[p].reduce((a, obj) => {
a += gt[obj.item].cost / gt[obj.item].count;
return a;
}, 0))]
});
sh.getRange(sr,8,g.length,g[0].length).setValues(g);
const end = "is near";
console.log(g);
}
[ [ 'Person A', 408 ],
[ 'Person B', 808 ],
[ 'Person C', 150 ],
[ 'Person E', 25 ],
[ 'Person F', 708 ] ]

起始数据:

项目1/th>人员A人员B人员C人员D人员E人员F

相关内容

最新更新