0

这可能是一个基本的和容易回答,但我已经拔了我的头发一段时间了!谷歌文件 - 电子表格循环

我已经构建了下面的代码 - 这是半伪的,因为我找不到正确的方法来使事情工作!

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++; 
    } 
    } 
} 

我有了这个图像中的数据data example

的基本思想是通过每个任务的所有可能的类别来运行,并保持多少的侧数字列表的例子每个都有。我也想让它变成动态的(所以我不需要在类别列表中使用硬编码),但我更感兴趣的是现在就开始工作。

Google Apps调试器非常令人沮丧!

感谢您的帮助!

回答

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()数组调用它是一个二维数组,所以你需要使用results[start[x][0]]++;

随着下一个循环和output变量,我必须承认我有点失落,你在那里做什么。你想如何布置结果表?

1

你有

output = "J11"; 

然后你做

ss.getRow(output); 
output++; 

这是所有的invalid.First,SS是表下有没有getRow方法将。所以,你真的应该做的是这样的事情

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++: 
} 
0

像AdamL,我认为这是更好的电子表格的本地能力范围内进行处理。在我看来,你想要一个数据透视表,它会动态更新。或者,像= countif(F:F,“Currently On”)这样的公式将满足您的即时请求。 =唯一(F:F)会给你一个数组中的类别列表