为什么getCell()返回的是“范围”,而不是值?

3

我正在编写一个非常简单的脚本,用于记录一列中的值。我之前在Google Apps Script中使用过类似的结构,并取得了巨大的成功,但是我无法看出问题所在。"statusColumn" 中填充了不同的值,当我尝试像这样记录它们时,所有行都返回 "Range"。你有什么建议吗?

var statusColumn = 1;

function getOrders() {
    var ss = SpreadsheetApp.openById("12y85GmJ94s6k3213j2nGK8rFr0GOfd_Emfk8WHu_MUQ");
    var sheet = ss.getSheetByName("Sheet8");
    var orders  = sheet.getDataRange();
    var numRows  = orders.getNumRows();

    for (var i = 1; i <= numRows; i++) {
        var status = orders.getCell(i, statusColumn);
        Logger.log([status]);
    }
}

编辑:

var statusColumn = 1;

function getOrders() {

     var ss =  SpreadsheetApp.openById("12y85GmJ94s6k3213j2nGK8rFr0GOfd_Emfk8WHu_MUQ");
     var sheet = ss.getSheetByName("Sheet8");
     var orders  = sheet.getDataRange();
     var numRows  = orders.getNumRows();

     for (var i = 1; i <= numRows; i++) {
         var statusCell = orders.getCell(i, statusColumn).getValue();
         Logger.log(statusCell)
     }
}
2个回答

3

getCell() 返回一个 Range 对象,此处该范围表示单个单元格,但 Range 对象也可以表示一组单元格。您要查找的是单元格的值,可以通过使用 getValue() 从 Range 中检索出来。

Logger.log(status.getValue());

请看:

见: https://developers.google.com/apps-script/reference/spreadsheet/range https://developers.google.com/apps-script/reference/spreadsheet/range#getValue()

顺便说一下,你正在使用的方法(逐个获取单元格)非常低效。 相反,您应该使用getRange()获取整个列,然后使用getValues()获取所有值。 GetValues()将返回一个数组,其中包含所有状态值。

这些函数在上面的链接中都有详细说明。


那么,如果我使用.getValues(),如何在for循环中指定值呢?例如,如果我想要指定我现在正在处理状态单元格(即第1列,状态列),该怎么做?这是不同的,因为我将不再需要再次获取值。 - William Larsen Bang
没关系,我已经找到如何引用它的方法,并在回答这个问题时发布了。 - William Larsen Bang

3

您正在使用函数,它完全按其名称所说的那样;获取您的范围

要获取范围的值,需要使用.getValues()

示例代码:

sheet.getRange('A1:A3').getValues();
.getRange().getDataRange() 的唯一区别在于前者仅选择您指定的范围,如果您想将范围限制为表格中特定的内容,则这很好;而后者会自动查找工作表中所有的值并将其返回给您。任何空单元格都将显示为[notemptycell, , ,],其中在该行上有3个空单元格的数组。请记住,返回给您的对象是一个二维数组,因此您需要使用两个for循环来执行此模式:
for (var i = 0; i < values.length; i++) {
  // Loops through the rows
  for (var j = 0; j < values[i].length; j++) {
    // Loops through the columns of a row
  }
}

你好,我在编辑下发布了一项更改,尝试了@Cameron Roberts下面的回答,这很有效。我还尝试使用.getValues,但没有成功,似乎无法引用每个单元格。我想我需要创建某种变量,比如var statusCell = order(i, statusColumn)之类的东西?(我知道这个例子不起作用,只是为了说明我的观点:)) - William Larsen Bang
1
看起来你已经搞清楚如何在自己的代码中使用了,这很好。你所做的分离和 sheet.getDataRange().getValues(); 没有区别。你将会得到一个数组的数组作为返回值,这就是为什么你原来的 for 循环没有起作用的原因。 - Gemtastic
是的,我现在明白了,这非常聪明,而且当我测试它时速度当然更快了 :) 但我有一个不同的问题,我使用了谷歌关于应用脚本的教程之一,其中包括电子邮件,以避免重复发送电子邮件,据我所知,我已经按照相同的方式做了一切,但它似乎忽略了我的“SENT”标记。我已在编辑下发布了它。 - William Larsen Bang
尝试运行 Logger.log(typeof system) 并查看它输出了什么。 - Gemtastic
1
让我们在聊天中继续这个讨论 - William Larsen Bang
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接