【问题标题】:Google Sheets Script - Loop through array, find array items with only text and partial text and replace whole itemGoogle Sheets Script - 遍历数组,查找只有文本和部分文本的数组项并替换整个项
【发布时间】:2021-10-23 03:31:45
【问题描述】:

我有一个工作一半的代码,我想不通的最后一件事是如何找到一个包含数字(例如 123)和一些文本(m/s)的数组项并将整个项目替换为完全空白的数组项:[]。没有数字,也没有 m/s。

我不熟悉大多数术语,并且完全是新手。这是我到目前为止所得到的:

function condForm() {
  var sh = ss.getSheetByName('Sheet1');
  var range = sh.getRange("D4:D20"); //*** for the sake of brevity setting to 20 instead of 154
  var values = range.getValues();  
  var row = [];
  var cols = values[0].length;

  for (var i = 0, l = values.length; i < l; i++)
  {
    row = values[i];
    for (var j = 0; j < cols; j++)
    {
      if (row[j] === 'TTK') { row[j] = ''; }
      if(typeof row[j] != "string") { continue; } // line to allow indexOf to work
      if (row[j].indexOf('m/s') > -1) { var newValue = row[j].replace('m/s', '') } //attempting to use indexOf to search for partial match to m/s, does not work but does not return error
    }
  }
Logger.log(values);
}

没有代码,记录器输出[[400.0], [600.0], [600.0], [600.0], [], [1283 m/s], [TTK], [440.0], [661.0], [771.0], [771.0], [], [960m/s], [TTK], [381.0], [667.0], [667.0]]

使用上面的代码,输出变为[[400.0], [600.0], [600.0], [600.0], [], [1283m/s], [], [440.0], [661.0], [771.0], [771.0], [], [960m/s], [], [381.0], [667.0], [667.0]] = 相同数量的数组项 = 非常成功

我尝试使用indexOf 搜索任何数组项包含 m/s。它不起作用,但也没有返回错误。它在做什么?我是否完全正确?

我想要一种将[1283m/s][960m/s] 变为空白的方法:[]

感谢您的阅读。

我的代码来自 Max Makhrov: https://stackoverflow.com/a/47575871/1341041

来自 Andres Duartehttps://stackoverflow.com/a/60226151/1341041

【问题讨论】:

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


    【解决方案1】:

    据我所知,您正在更改数组 row。但是您永远不会更改数组values

    可能你在中间需要这样的东西:

    ...
    
    if (row[j] === 'TTK') { values[i][j] = ''; }
    if (typeof row[j] != "string") { continue; }
    if (row[j].indexOf('m/s') > -1) { values[i][j] = row[j].replace('m/s', '') }
    
    ...
    

    但实际上出于您的目的,我建议使用本机工具TextFinder

    function condForm() {
      const sheet = ss.getSheetByName('Sheet1');
      const range = sheet.getRange('D4:D20');
      // range.createTextFinder('m/s').replaceAllWith('');
      range.createTextFinder('.*m/s.*').useRegularExpression(true).replaceAllWith('');
      range.createTextFinder('^TTK$').useRegularExpression(true).replaceAllWith('');
    }
    

    https://developers.google.com/apps-script/reference/spreadsheet/text-finder

    以防万一,如果你真的进入了嵌套循环,也可以通过这种方式做得更干净一些:

    var values = [[400], [600], [600], [600], [], ['1283 m/s'], ['TTK'], [440], [661], [771], [771], [], ['960m/s'], ['TTK'], [381], [667], [667]];
    
    for (row in values) {
      for (col in values[row]) {
        if (values[row][col] == 'TTK') values[row][col] = '';
        // values[row][col] = values[row][col].toString().replace(/\s*m\/s/g,'');
        values[row][col] = values[row][col].toString().replace(/.*m\/s.*/,'');
      }
    }
    
    console.log(values);

    【讨论】:

    • 谢谢尤里,我最终使用了底部解决方案。我不知道如何使用看起来更干净的第二个函数来记录数组。也奇怪的是它告诉我 getSheetByName 不是一个函数,但我用你的最后一个解决方案实现了它很好?再次感谢,很棒的代码!
    • 糟糕。我的错。这是错字。应该有ss 而不是SpreadsheetApp --> const sheet = ss.getSheetByName('Sheet1');
    • 啊,我明白了,我仍然无法让文本查找器记录数组。使用它而不是嵌套循环会更好吗?顺便说一句,这是完美的。我的下一个计划是应用 Math.max 来获得最大的数字,然后我想实现动态范围,可能使用坐标语法而不是单元格引用。
    • 如果你想删除所有包含“m/s”的文本,你只需要调整正则表达式。在 textFinder 示例中将 range.createTextFinder('m/s').replaceAllWith(''); 替换为 range.createTextFinder(".*m/s.*").useRegularExpression(true).replaceAllWith('');。或者在嵌套循环示例中将replace(/\s*m\/s/g,''); 替换为replace(/.*m\/s.*/,'');
    • 至于什么是更好的“textFinder”或循环遍历普通的 JS 数组——这取决于你。 “TextFinder”没有给你数组,你需要在之后使用range.getValues()。因此,就您而言,这两种方式毕竟是相同的。
    猜你喜欢
    • 2020-09-20
    • 2018-05-27
    • 2017-10-17
    • 2020-05-29
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多