Google apps script 谷歌脚本与电子表格-功能来计算列值
我正在构建一个谷歌电子表格,在那里我将输入一组数据到该电子表格中,然后在另一张表格上,我想从中提取统计数据。我很难正确计算数值 我正在努力实现的目标 -构建一个函数,我可以将其添加到任何单元格中,通过基于函数中的目标/参数计算重复值来获取特定列的统计信息 例如: 表1在E列中有我需要计算的数据(包含1或2个字母以表示状态)。 表2是我将提取所有统计数据的地方。 我添加了这样一个函数:=getData(“a”) 函数本身已经指向sheet1和E列。函数在这里所说的是,“我希望您提取E列中的所有数据,并告诉我有多少单元格标记为A”,然后给我计数 我有大约5个不同的值,我会在这里独立搜索。我们会说A,B,C,D和E。所以如果我搜索C,我会使用:=getData(“C”)将统计数据拉到统计表上的另一个单元格中 到目前为止我所得到的(不起作用) -我对这些东西的编码相当粗略,所以我仍在学习很多。以下是我迄今为止的尝试:Google apps script 谷歌脚本与电子表格-功能来计算列值,google-apps-script,Google Apps Script,我正在构建一个谷歌电子表格,在那里我将输入一组数据到该电子表格中,然后在另一张表格上,我想从中提取统计数据。我很难正确计算数值 我正在努力实现的目标 -构建一个函数,我可以将其添加到任何单元格中,通过基于函数中的目标/参数计算重复值来获取特定列的统计信息 例如: 表1在E列中有我需要计算的数据(包含1或2个字母以表示状态)。 表2是我将提取所有统计数据的地方。 我添加了这样一个函数:=getData(“a”) 函数本身已经指向sheet1和E列。函数在这里所说的是,“我希望您提取E列中的所有数据
function getData(target) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET1");
var lrow = ss.getLastRow();
var r = ss.getRange(2, 5, lrow, 1);
var data = r.getValues();
var count;
for (var i = 0; i < lrow ; i++) {
var count = 1;
for (var j = 0; j < i; i++) {
if (data[j][0].value(target) == data[i][0].value(target)) {
count++;
}
}
return (count);
}
}
函数getData(目标){
var ss=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“SHEET1”);
var lrow=ss.getLastRow();
var r=ss.getRange(2,5,lrow,1);
var data=r.getValues();
var计数;
对于(变量i=0;i解析代码(感谢@ScampMichael)-这一微小的变化实际上允许我使用格式=getData(“Example1”、“Example2”)搜索多个值并计算总数:
function getData(target1, target2) {
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET1");
var lrow = ss.getLastRow();
var r = ss.getRange(2, 5, lrow-1, 1); // lrow-1 to not count header
var data = r.getValues();
var count = 0; // 0 must be declared here or you'll get error: Overflow on the spreadsheet
for (var i=0; i<data.length; i++) {
if (data[i][0] == target1) { // can repeat this part depending how many values you want to search for
count++;
}
if (data[i][0] == target2) {
count++;
}
}
return (count);
}
函数getData(target1、target2){
var ss=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“SHEET1”);
var lrow=ss.getLastRow();
var r=ss.getRange(2,5,lrow-1,1);//lrow-1不计数头
var data=r.getValues();
var count=0;//必须在此处声明0,否则您将得到错误:电子表格溢出
对于(var i=0;iEdited:i遗漏了var r=ss.getRange(2,5,lrow,1);应该是
var r = ss.getRange(2, 5, lrow - 1, 1); // because starting at row 2
因为源数据只有一列宽,所以在循环中不需要循环,但我保留了它,以防您希望在源中有多个列
for (var i = 0; i < data.length ; i++) {
for (var j = 0; j < data[i].length; j++) {
if (data[i][j] == target) {
count++;
}
}
}
for(变量i=0;i
对于单个列,您可以:
for (var i = 0; i < data.length ; i++) {
if (data[i][0] == target) {
count++;
}
}
for(变量i=0;i
还有一个内置函数:=COUNTIF(SHEET1!E2:E,“A”)我想您考虑过使用标准的电子表格函数吗?非常容易进行计数和求和(如果您正在计数或求和的是直接进行的).我已经考虑过了。这种情况下的问题是,我将获得的每个统计数据的复杂性都需要在我的工作表上放上一堆电子表格代码。通过构建一个函数,尽管比单一使用的电子表格函数复杂一点,但实际上我只需要简单的公式方面。这也将允许我的经理根据他们将来需要什么或我们以后是否添加其他状态来修改函数。你好,ScampMichael。从你给我看的情况来看,我已经非常接近了。我尝试了你的代码,现在当我添加=getData(“A”)时,我在谷歌电子表格中的单元格中收到一个错误,说明:[NUM!-错误:溢出。如果我尝试=getData(“A”),我会收到一个错误(A) {无引号},然后我得到[#名称?-错误:未知范围名称A].嘿,史蒂夫,你确实需要引号。我看不出有什么问题。请你编辑你的问题并将代码粘贴到脚本编辑器中,就像你从脚本编辑器中得到的一样好吗?另外,为了让你开心,试着用零初始化你的count变量--var count=0;就是这样。我必须声明count=0,它按预期工作。除此之外,我还可以o给出多个目标。我将在上面的帖子中添加最终代码。非常感谢@ScampMichael。