【问题标题】:Can't regexp with cell value无法使用单元格值进行正则表达式
【发布时间】:2016-07-12 05:09:57
【问题描述】:

我正在尝试从类型为“时间”的单元格中获取值。

在表格中,它看起来像:“15:40”(手动填写)

如果我在这个单元格中使用getValue(),而在另一个单元格中使用setValue,那将没有问题。

但是当我尝试使用正则表达式进行一些解析时,我收到了如下错误:

TypeError:在对象“Sun Dec 31 1899 05:22:00 GMT+0300 (MSK)”中找不到函数 match

这是代码本身,很简单:

...
var sheet = SpreadsheetApp.getActiveSheet();
cell = sheet.getRange(1, 1).getValue();
cellpart = cell.match(..:..);
... 

Debug 表示类型不是“String”,而是“Data”,它的值在上面错误消息的双引号中。 如何从单元格中获取字符串值?看起来很简单,但我整晚都在试图弄错。任何帮助将不胜感激。

【问题讨论】:

  • 我现在意识到的最大问题不是tostring转换,而是value中的数据。在单元格中我只填写时间,我可以看到还有一个当前日期。但是使用 getValue() 我完全得到了另一个时间和日期。 1899 年等?

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


【解决方案1】:

要将你的数据变成一个字符串,你可以使用.toString()

cell.toString().match(..:..)

请注意,cell 是一个 Date 对象。这就是为什么它不支持.match,但是你可以把它做成一个字符串,这样就可以把它变成字符串值"Sun Dec 31 1899 05:22:00 GMT+0300 (MSK)."

【讨论】:

  • 谢谢,但问题是值“Sun Dec 31 1899 05:22:00 GMT+0300 (MSK)”。 - 不是我在细胞中的价值。当我填充单元格时,它包含当前日期和时间。那一行是从哪里来的——我不明白。
【解决方案2】:

从工作表创建邮件合并时,我也遇到了这个问题。我不需要匹配/搜索这些值,但此过程的第一步是将数据转换为您想要的格式。之后,您可以将其重写回单元格或从那里处理。

以下是我传输日期格式的方法,然后以我需要的格式将值写入数组。这有效地删除了所有额外的垃圾日期信息。一旦我有了一个干净的日期,我就可以毫无问题地处理这些数据。

var rawSubmitDate = sheet.getRange((i+2), 1, 1, 1).getValue();
var submitDate = Utilities.formatDate(rawSubmitDate, "PST", "MM/dd/yy");

这第一部分与包含数据的行的循环一起使用。您可以看到我使用.formatDate() 将长数据形式设置为我想要的。您可以在 GAS 参考以及在线日期格式的语法中找到有关如何按您需要的方式格式化的更多信息。

var lastColumn = sheet.getMaxColumns();
var dataRow = sheet.getRange((i+2), 1, 1, (lastColumn - 2));
var dataArray = dataRow.getValues();
              dataArray[0][2] = whenA;
              dataArray[0][25] = whenB
              dataArray[0][37] = whenC;
              dataArray[0][40] = whenD;
              dataArray[0][43] = whenE;
              dataArray[0][46] = whenF;

在本节中,我创建了一个包含所有值的数组,并将清理后的日期写入该数组。 [] 值由它们在我的行中的列索引定义。例如,第 26 行包含需要重新格式化的日期 (whenB)。这些日期是出生日期、事件发生时间等。

我没有编写代码将这些值放回工作表,因为我使用QUERY() 函数来填充我从中提取的工作表。将值写入QUERY() 所涉及的单元格将引发错误。然而,该过程需要一个嵌套循环。外循环循环遍历行,内循环循环遍历写入每个数据数组值的行中的列单元。外循环索引将由您拥有的行数定义;内部循环索引将由您拥有的列数定义。

【讨论】:

    【解决方案3】:

    尝试使用 getDisplayValue( 而不是 getValue(。这将返回显示的单元格值而不是基础日期值。

    这是我发现提取 Duration(从 Google 表单中插入)的最佳方法,而不需要 Date 值中固有的所有 gobbledygook。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      相关资源
      最近更新 更多