这个可能有点基本且容易回答,但我已经把头发拉了一段时间了!
我已经构建了以下代码 - 这是半伪的,因为我无法找到使事情正常工作的正确方法!
var s = "Test";
function onEdit(event)
{
var ss = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if (ss.getName() == s)
{
results = {"Currently On": 0, "Next Up": 0, "On Hold": 0, "Waiting on someone else": 0, "zDone": 0};
last = ss.getMaxRows();
start = ss.getRange("F3:"+last).getValues();
var output = "J11";
for (x=0;x<start.length;x++)
{
results[start[x]]++;
}
for (y=0;y<results.length;y++)
{
row = ss.getRow(output);
row.value = results[y];
output++;
}
}
}
我在此图片中有一个数据示例
基本思想是贯穿每个任务的所有可能类别,并在每个任务的数量方面保留一个数字列表。我也想让它变得动态(所以我不需要在类别列表中使用硬编码)但我现在更感兴趣的是让它在当前工作。
Google Apps调试器非常令人沮丧!
感谢您的帮助!
答案 0 :(得分:1)
首先,使用电子表格公式可以轻松实现此特定用例,例如:
=QUERY(A2:F;"select F, count(A) where F != '' group by F label count(A) 'Count'";1)
但可能有理由说你想用GAS做这件事。
其次,我认为这可能存在一些语法问题:
last = ss.getMaxRows();
我只想在这里使用var last = ss.getLastRow()
。
start = ss.getRange("F3:"+last).getValues();
范围引用将评估为“F3:100”,这是GSheets中的有效引用(不知道GAS是否可以处理它),但是你真的想要像“F3:F100”这样的东西,所以我会使用var start = ss.getRange("F3:F"+last).getValues();
。
results[start[x]]++;
从getValues()
调用创建数组时,它是一个2D数组,因此您需要使用results[start[x][0]]++;
。
使用下一个循环和output
变量,我必须承认我在那里做的事情有点迷失。你是怎么想要你的结果表布局的?
答案 1 :(得分:1)
你有
output = "J11";
然后你做
ss.getRow(output);
output++;
这是无效的。首先,ss是一个没有getRow方法的Sheet。那么,你真正要做的就是这样的事情
var row = 11 ;
var col = 10 ; //Col J
for (y=0;y<results.length;y++)
{
ss.getRange(row,col,1,1).setValue(results[y]);
row++:
}
答案 2 :(得分:0)
与AdamL一样,我建议在电子表格的本机功能中更好地处理这个问题。在我看来,你想要一个动态更新的数据透视表。或者,像= countif(F:F,“Currently On”)这样的公式将满足您的即时要求。 =唯一(F:F)将为您提供数组中的类别列表