【问题标题】:Retrieve getDisplayValue() of specific cell in array produced by formula检索公式生成的数组中特定单元格的 getDisplayValue()
【发布时间】:2021-09-14 16:43:06
【问题描述】:

阅读了几篇解决无法使用应用程序脚本检索公式产生的值的帖子后,我怀疑我只是在这上面浪费宝贵的时间。

通过脚本,我使用 getDisplayValues() 检索了一组 显示 值,并使用 getValues() 检索了实际(我认为)值。每个数组都包含整列,而实际上只有单元格 2-11 包含公式输出。

尝试从数组中检索值返回 NULL。

var SpreadsheetID = "myID";
var SheetName = "mySheet";


function gammaTilt() {
  var ss = SpreadsheetApp.openById(SpreadsheetID);
  var sheet = ss.getSheetByName(SheetName);
  var column = sheet.getRange("AH1:AH");

  var dispVal = column.getDisplayValues(); // returns array of full column, including display values
  var cellVal = column.getValues(); // returns array of full column, including actual (?) values

  var label = dispVal[0][0]; // returns column header, a string value
  var d = dispVal[11][0];    // returns null
  var a = cellVal[11][0];    // returns null
};

AH 列的长度是动态的,因此解决方案必须找到数据范围长度,然后是范围中的最后一个值。不过,apps 脚本似乎找不到由公式创建的范围?

这样做会复杂得多,但这是唯一可行的方法来开发与原始数据集一起使用的应用程序脚本,而不是对这些数据进行电子表格操作?

编辑: cellVal 的日志输出

[21-09-14 13:02:33:500 PDT] Logging output too large. Truncating output.
[[All Date],
[Sun Aug 29 17:00:00 GMT-07:00 2021],
[Mon Aug 30 17:00:00 GMT-07:00 2021],
[Tue Aug 31 17:00:00 GMT-07:00 2021],
[Wed Sep 01 17:00:00 GMT-07:00 2021],
[Thu Sep 02 17:00:00 GMT-07:00 2021],
[Mon Sep 06 17:00:00 GMT-07:00 2021],
[Tue Sep 07 17:00:00 GMT-07:00 2021],
[Wed Sep 08 17:00:00 GMT-07:00 2021],
[Thu Sep 09 17:00:00 GMT-07:00 2021],
[Sun Sep 12 17:00:00 GMT-07:00 2021],
[Mon Sep 13 17:00:00 GMT-07:00 2021],

//The remainder of the array is empty cell values

工作表中的实际单元格值:

AH1    All Date
AH2    Mon Aug 30 2021
AH3    Tue Aug 31 2021
AH4    Wed Sep 1 2021
AH5    Thu Sep 2 2021
AH6    Fri Sep 3 2021
AH7    Tue Sep 7 2021
AH8    Wed Sep 8 2021
AH9    Thu Sep 9 2021
AH10   Fri Sep 10 2021
AH11   Mon Sep 13 2021
AH12   Tue Sep 14 2021

知道为什么日期字符串在返回的数组中是偏移的吗?

【问题讨论】:

  • 字符串Sun Aug 29 17:00:00 GMT-07:00 2021 看起来有点奇怪。尝试更改此列的格式以查看这些日期的时间。我怀疑它会将时间重置为0:00:00
  • 有趣。仅时间格式显示 12:00:00AM。日期和时间显示日期 + 时间为 0:00:00。添加 AM / PM 会将其还原为 12:00:00AM。该脚本仍然检索具有偏移量的日期。你问过时区 - 我在太平洋标准时间。我将设置从“太平洋”更改为“太平洋 - 温哥华”和宾果游戏。我把它改回太平洋,问题解决了。返回的字符串仍然是:[Mon Aug 30 00:00:00 GMT-07:00 2021],无论对列格式进行任何更改。

标签: google-apps-script google-sheets-formula


【解决方案1】:

appScript 中的索引从 0 开始(与大多数编程语言一样)因此 cellVal[11][0] 正在尝试从单元格 AH12 中提取值。

如果您正在寻找来自单元格 AH11 的值,即 cellVal[10][0]

此外,.getValues() 不会提取公式,因此您可以安全地使用它,您不需要使用 .getDisplayValues()

【讨论】:

  • .getDisplayValues() 用于您有格式化数字的情况,例如单元格中的“2021 年 9 月 14 日星期二”。 .getValue() 将提取该日期的基础 NUMBER 值,而 .getDisplayValue() 将提取该实际文本。该日期是否是公式的结果无关紧要。
  • 感谢您指出索引结构。我认为 Javascript 是 0 而 appScript 是 1,所以我的错误在那里。还要感谢有关 getValue() 与 getDisplayValues() 的其他信息。这是一个有用的区别。我不知道为什么,但 getValues() 返回显示日期 -1 天(即星期一,工作表的单元格值,返回为星期日)。
  • @jivers 仔细检查脚本作者谷歌帐户和工作表区域设置(文件>电子表格设置)是否在同一时区?
  • 两者都设置为相同的时区。根据 Yuri 的 cmets,一个测试文件(无法共享原始文件)和脚本会生成一个具有准确结果的数组。在原始电子表格中,在 AH 列中生成所有日期列表的工作表公式是 UNIQUE()(与测试文件中的相同)。 Data Studio 中的控制过滤器也使用 UNIQUE 公式所针对的数据集中的列。控件显示正确的日期,排除了格式问题。
  • @jivers 好的。抱歉,如果无法重现问题,我不知道如何继续。
【解决方案2】:

试试这个:

var d = dispVal[11][0];
var a = cellVal[11][0];

更新

至于日期中的“偏移”。我确定这与电子表格设置中的时区偏好有关。

看,我已经制作了获取您的日期并将它们转换为日期对象的函数:

function test_dates() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange('A1:A11');
  var dates = range.getValues().map(x => [new Date(x[0])]); // strings --> objects
  range.offset(0, 1).setValues(dates);
}

如果我设置时区 GMT+00,我会得到“偏移量”:

如果我设置时区 GMT-07,“偏移”就会消失:

至于“null”返回,抱歉。除非没有可重现的代码 + 虚拟数据,否则不要猜测。我用我的数据尝试了你的代码,它工作得很好。它返回单元格 [11][0] 中的值,无论该值是静态的还是通过公式计算的。

【讨论】:

  • 正确定位数组(我的错误,代码已编辑),但仍然没有返回任何内容。
  • 分享您的工作表。我敢肯定,还有另一个像这样的愚蠢错字。或者只是尝试使您的代码示例可重现。 (并且“错误”消失了)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多