【问题标题】:Google Spreadsheet getValue([cell containing \t]) does not return a tabulatorGoogle Spreadsheet getValue([cell contains \t]) 不返回制表符
【发布时间】:2016-05-18 16:11:45
【问题描述】:

我在 google 电子表格中有一个单元格,其中包含文本“s/ *│ */\t/g”。

我正在使用代码

function minimalExample(){
  var text = "a │ b"

  var pattern = SpreadsheetApp.getActiveSheet().getRange('B3').getValue() // cell contains "s/ *│ */\t/g"
  var regexSplitter = /s\/(.*)\/(.*)\/(\w+)/;      // pattern to split sed line into search/replace/modifier
  var patternParts = pattern.match(regexSplitter);   // list with search [1], replace [2], modifier [3]

  text = text.replace(new RegExp(patternParts[1], patternParts[3]),patternParts[2]);
  Logger.log(text);

  return true;
}

预期的输出是“a b”,但我得到的是“a\tb”。

如何改变这种行为?

【问题讨论】:

  • 为什么预期的输出是a b?您收到的是a\tb,因为这正是单元格中写的内容。从您放入代码中的"\t" 中制作标签的东西基本上是读取您的代码的解析器。从其他地方加载的字符串不会神奇地转换。如果要将字符串中的所有\ts 转换为制表符,则需要对其执行.replace(/\\t/g, "\t")
  • 那么,"a b" 将是 desired 输出:)

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


【解决方案1】:

对我来说,您的代码运行良好:

[16-05-18 18:20:27:447 CEST] \t   is not the same as    

但是我猜你的真实代码看起来不同,并且像patternParts[2] == "\t" 那样进行比较,因为字符\t 确实与is not the same as 之后的不可见制表符不同。

所以,事情恰恰相反:patternParts[2] 确实包含\t,但您的比较不正确。在 JavaScript 中,使用双引号时可以使用转义序列,例如 \n\t\uXXXX 等。

因此,如果您想比较 patternParts[2]\t,请使用单引号 (patternParts[2] == '\t') 或转义反斜杠 (patternParts[2] == "\\t")。

编辑:根据您更新的问题:如果您想实际转换单元格中的所有\ts(只是这两个字符,\t,没什么特别的) 到标签,然后你需要去替换它们:

patternParts[2] = patternParts[2].replace(/\\t/g, "\t");

如果您的替换部分中有与 JavaScript 兼容的转义序列,您还可以使用 JSON.parse('"' + theString + '"') 等技巧让 JS 替换其中的所有转义序列。请注意,如果您的字符串中有无效的内容(例如杂散的未转义双引号),这将引发异常,因此请注意:

try {
    patternParts[2] = JSON.parse('"' + patternParts[2] + '"');
} catch(e) {
    // Invalid syntax! Handle the error here somehow
}

【讨论】:

  • 对不起,我表达错误,例子太少了。我编辑了代码并添加了预期与实际输出。
猜你喜欢
  • 2015-08-17
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多