Google文档 - 电子表格循环

时间:2012-08-01 03:09:23

标签: javascript google-apps-script google-docs-api google-sheets google-spreadsheet-api

这个可能有点基本且容易回答,但我已经把头发拉了一段时间了!

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

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调试器非常令人沮丧!

感谢您的帮助!

3 个答案:

答案 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)将为您提供数组中的类别列表