Google Apps 脚本中的字符串相等

String Equality in Google Apps Script

提问人:5imon 提问时间:5/17/2022 更新时间:5/18/2022 访问量:765

问:

我正在尝试将从JSON对象中检索到的名称与Google表格中存在的名称进行比较。尽我所能尝试,我无法得到产生积极结果的比较。 我试过:

IndexOf

localeCompare

==

===

我试过了. 我还尝试调用所有内容以确保没有前导/尾随空格(没有,通过比较证实。key===valueString(key)===String(value)String(key).valueof()=String(value).valueoftrim()length()

从屏幕截图中可以看出,和的值完全相同。 任何指示将不胜感激。这已经耽搁了我的项目好几天了!keyvalue

截图在这里

JavaScript 字符串 google-apps-script 相等

评论

0赞 Tanaike 5/17/2022
在您的显示图像中,不应该是?String(key).valueofString(key).valueof()
0赞 liquidkat 5/17/2022
String(key).valueof()=String(value).valueof,valueOf 的末尾应该有()吗?在您的屏幕截图上也没有。我不确定这是否是错误的原因,如果可以,请发布错误消息。这可能会有所帮助
0赞 5imon 5/17/2022
谢谢 - 我实际上发现了它并修复了它,但粘贴了错误的 imgur 链接。这是更新后的链接 imgur.com/a/dwlVojM。没有错误消息,我只是没有得到匹配。相等性测试总是失败。
0赞 TheMaster 5/18/2022
回答了你的问题吗?

答:

2赞 TheWizEd 5/17/2022 #1

描述

这不是一个解决方案,但它可能有助于找到问题。也许其中一个或另一个中的字符不是你想的那样。从视觉上看,它们会进行比较,但是如果有一个选项卡而不是空格呢?试试这个,列出每个字符的字符代码,看看是否有任何字符具有不同的值。

我添加了另一个选项,由于@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

评论

0赞 5imon 5/19/2022
这是个好主意,谢谢。我为两者运行了这个,结果发现谷歌表上名称列表中的名称中的空格与 JSON 对象中的名称的字符代码不同。有趣的是,我正在通过以下方式从JSON对象构造名称(请参阅 imgur.com/a/dwlVojM)。因此,GAS 代码中使用的空格不等于 Gsheet 上定义的空格!字符代码为 160 和 32。我现在正试图找到它们的定义是什么......first_name + " " + last_name
0赞 Cooper 5/17/2022 #2

比较

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型

评论

0赞 5imon 5/19/2022
嗨 - 非常感谢您的代码 - 我选择了上面的答案,因为它是首先发布的