【问题标题】:Why is getCell() returning "Range" instead of the values?为什么 getCell() 返回“范围”而不是值?
【发布时间】:2016-01-31 07:26:37
【问题描述】:

我正在编写一个非常简单的脚本,它将值记录在一个列中,我之前在 Google Apps 脚本中使用过类似的结构并取得了巨大的成功,但我在这里看不到问题。 “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)
     }
}

【问题讨论】:

    标签: javascript for-loop google-apps-script google-sheets range


    【解决方案1】:

    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 列中的 statusCell,(statusColumn )。因为它会有所不同,因为我不再需要再次获得价值?
    • 没关系,我找到了如何引用它,发布在这个问题的回答中。
    【解决方案2】:

    您正在使用的功能完全符合其名称;为您提供范围

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

    示例代码:

    sheet.getRange('A1:A3').getValues();
    

    .getRange().getDataRange() 之间的唯一区别是前者只会选择您指定的范围,如果您想将范围限制为工作表中的特定内容,这很好,而后者会自动查找 alll工作表中的值并返回给您。

    任何空单元格都会看起来像 [notemptycell, , ,],如果您在该行上有 3 个空单元格,那就是一个数组。

    记住;您返回给您的对象是一个数组数组,因此您需要按此模式循环两次:

    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) 什么的? (我知道这个例子行不通,这只是为了说明我的观点:))
    • 看起来您已经知道如何在自己的代码中使用它,这很棒。您所做的分离与sheet.getDataRange().getValues(); 没有区别。您将收到一个数组数组作为值返回给您,这就是您原来的 for 循环不起作用的原因。
    • 是的,我现在明白了,它非常聪明,当然,现在我正在测试它,当然速度要快得多 :) 但我有一个不同的问题,我在 appscript 上使用了谷歌教程之一,那个电子邮件,以避免重复发送电子邮件,据我所知,我已经以相同的方式完成了所有操作,但它似乎被“SENT”标记忽略了。我把它贴在 EDIT 下。
    • 试试Logger.log(typeof system),看看它会打印什么。
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多