Google Apps 脚本中的字符串相等性
String Equality in Google Apps Script
我正在尝试比较从 JSON 对象中检索到的名称与存在于 google Sheet 中的名称。尽我所能,我无法得到一个产生积极影响的比较。
我试过:
IndexOf
localeCompare
==
===
我试过了
key===value
String(key)===String(value)
和
String(key).valueof()=String(value).valueof
。
我还尝试对所有内容调用 trim()
以确保没有 leading/trailing 空格(没有,已通过 length()
比较确认。
从截图中可以看出,key
和value
的值是完全一样的。
任何指针将不胜感激。这让我的项目耽搁了好几天!
Screenshot here
描述
这不是解决方案,但可能有助于找到问题所在。也许一个或另一个中的角色不是你想的那样。他们在视觉上进行了比较,但是如果有一个选项卡而不是 space 呢?试试这个,列出每个字符代码,看看是否有任何字符具有不同的值。
感谢@TheMaster
,我添加了另一个消除 for 循环的选项
脚本(选项 1)
function test() {
try {
let text = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test").getRange("A1").getValue();
console.log(text);
let code = [];
for( let i=0; i<text.length; i++ ) {
code.push(text.charCodeAt(i))
}
console.log(code.join());
}
catch(err) {
console.log(err);
}
}
脚本(选项 2)
function test() {
try {
let text = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test").getRange("A1").getValue();
console.log(text);
let code = [];
[...text].forEach( char => code.push(char.charCodeAt(0)) );
console.log(code.join());
}
catch(err) {
console.log(err);
}
}
执行日志
7:57:53 AM Notice Execution started
7:57:56 AM Info Archie White
7:57:56 AM Info 65,114,99,104,105,101,32,87,104,105,116,101
7:57:54 AM Notice Execution completed
比较
function compare() {
const json = '{"values":[["good","bad","ugly"]]}';
const obj = JSON.parse(json);
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
const [hA,...vs] = sh.getDataRange().getDisplayValues();
let matches = [];
vs.forEach((r,i) => {
r.forEach((c,j) => {
let idx = obj.values[0].indexOf(c);
if(~idx) {
matches.push({row:i+1,col:j+1,index: idx});
}
})
})
Logger.log(JSON.stringify(matches))
}
Execution log
9:31:50 AM Notice Execution started
9:31:52 AM Info [{"row":1,"col":1,"index":0},{"row":2,"col":1,"index":1},{"row":3,"col":1,"index":2}]
9:31:51 AM Notice Execution completed
工作表 1:
COL1
good
bad
ugly
我正在尝试比较从 JSON 对象中检索到的名称与存在于 google Sheet 中的名称。尽我所能,我无法得到一个产生积极影响的比较。 我试过:
IndexOf
localeCompare
==
===
我试过了
key===value
String(key)===String(value)
和
String(key).valueof()=String(value).valueof
。
我还尝试对所有内容调用 trim()
以确保没有 leading/trailing 空格(没有,已通过 length()
比较确认。
从截图中可以看出,key
和value
的值是完全一样的。
任何指针将不胜感激。这让我的项目耽搁了好几天!
Screenshot here
描述
这不是解决方案,但可能有助于找到问题所在。也许一个或另一个中的角色不是你想的那样。他们在视觉上进行了比较,但是如果有一个选项卡而不是 space 呢?试试这个,列出每个字符代码,看看是否有任何字符具有不同的值。
感谢@TheMaster
,我添加了另一个消除 for 循环的选项脚本(选项 1)
function test() {
try {
let text = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test").getRange("A1").getValue();
console.log(text);
let code = [];
for( let i=0; i<text.length; i++ ) {
code.push(text.charCodeAt(i))
}
console.log(code.join());
}
catch(err) {
console.log(err);
}
}
脚本(选项 2)
function test() {
try {
let text = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test").getRange("A1").getValue();
console.log(text);
let code = [];
[...text].forEach( char => code.push(char.charCodeAt(0)) );
console.log(code.join());
}
catch(err) {
console.log(err);
}
}
执行日志
7:57:53 AM Notice Execution started
7:57:56 AM Info Archie White
7:57:56 AM Info 65,114,99,104,105,101,32,87,104,105,116,101
7:57:54 AM Notice Execution completed
比较
function compare() {
const json = '{"values":[["good","bad","ugly"]]}';
const obj = JSON.parse(json);
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("Sheet0");
const [hA,...vs] = sh.getDataRange().getDisplayValues();
let matches = [];
vs.forEach((r,i) => {
r.forEach((c,j) => {
let idx = obj.values[0].indexOf(c);
if(~idx) {
matches.push({row:i+1,col:j+1,index: idx});
}
})
})
Logger.log(JSON.stringify(matches))
}
Execution log
9:31:50 AM Notice Execution started
9:31:52 AM Info [{"row":1,"col":1,"index":0},{"row":2,"col":1,"index":1},{"row":3,"col":1,"index":2}]
9:31:51 AM Notice Execution completed
工作表 1:
COL1 |
---|
good |
bad |
ugly |