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

我有这张图片中的数据示例数据示例

基本思想是遍历每个任务的所有可能类别,并在每个任务的数量旁边保留一个数字列表。我也想让它动态化(所以我不必在类别列表中硬编码),但我更感兴趣的是让它暂时工作。

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

谢谢大家的帮助!

4

3 回答 3

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变量,我必须承认我对你在那里所做的事情有点迷茫。您希望如何布置结果表?

于 2012-08-01T04:32:58.107 回答
1

你有

output = "J11";

然后你做

ss.getRow(output);
output++;

这是无效的。首先,ss是一个Sheet,其下没有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++:
}
于 2012-08-01T05:58:57.847 回答
0

与 AdamL 一样,我建议在电子表格的本机功能中更好地处理这一点。在我看来,您想要一个可以动态更新的数据透视表。或者,像 =countif(F:F,"Currently On" ) 这样的公式可以满足您的即时要求。=Unique(F:F) 将为您提供数组中的类别列表

于 2012-08-02T05:58:26.357 回答