Google 电子表格 getValue([包含 \t 的单元格]) 没有 return 制表符
Google Spreadsheet getValue([cell containing \t]) does not return a tabulator
我在包含文本 "s/ *│ */\t/g" 的 google 电子表格中有一个单元格。
我正在使用代码
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"。
如何改变这种行为?
对我来说你的代码工作正常:
[16-05-18 18:20:27:447 CEST] \t is not the same as
但是我猜你的真实代码看起来不一样,并且做了一个像 patternParts[2] == "\t"
的比较,因为字符 \t
确实不同于 is not the same as
.[=29= 之后的不可见制表符]
所以,事情是相反的:patternParts[2]
确实包含 \t
但你比较的不正确。在JavaScript中,使用双引号时可以使用\n
、\t
、\uXXXX
等转义序列
因此,如果您想将 patternParts[2]
与 \t
进行比较,请使用单引号 (patternParts[2] == '\t'
) 或转义反斜杠 (patternParts[2] == "\t"
)。
编辑: 根据您更新的问题:如果您想实际转换单元格中的所有 \t
s(这只是那两个字符,\
和 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
}
我在包含文本 "s/ *│ */\t/g" 的 google 电子表格中有一个单元格。
我正在使用代码
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"。
如何改变这种行为?
对我来说你的代码工作正常:
[16-05-18 18:20:27:447 CEST] \t is not the same as
但是我猜你的真实代码看起来不一样,并且做了一个像 patternParts[2] == "\t"
的比较,因为字符 \t
确实不同于 is not the same as
.[=29= 之后的不可见制表符]
所以,事情是相反的:patternParts[2]
确实包含 \t
但你比较的不正确。在JavaScript中,使用双引号时可以使用\n
、\t
、\uXXXX
等转义序列
因此,如果您想将 patternParts[2]
与 \t
进行比较,请使用单引号 (patternParts[2] == '\t'
) 或转义反斜杠 (patternParts[2] == "\t"
)。
编辑: 根据您更新的问题:如果您想实际转换单元格中的所有 \t
s(这只是那两个字符,\
和 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
}