【问题标题】:Find Replace all values in a column Google script/JavaScript查找替换列 Google 脚本/JavaScript 中的所有值
【发布时间】:2020-11-27 17:10:15
【问题描述】:

我需要在一列的所有单元格中找到多个值,并用不同的值替换它们

如果我只有一个值可以查找/替换我的函数效果很好

function FindReplace() {
  var ss = SpreadsheetApp.getActiveSheet();
  var col = [].concat.apply([], ss.getRange(2,3,ss.getLastRow()).getValues()); 
  
  ss.getRange(2,3,ss.getLastRow()).setValues(col.map(fr));
  
  function fr(input){
    return [input.replace("something","something else")];
  }
 
}

但我需要找到一个列表中的所有值并从另一个列表中替换它们,列表可以有 n 个元素

var ifind = ["This", "That", "The other"];

并用不同的列表替换它们

var ireplace = ["AAA", "BBB", "CCC"];

我一直在尝试在下面使用 map() 或 forEeach() 来执行此操作,但无济于事

function findreplace(input){
  var ifind = ["This", "That", "The other"];
  var ireplace = ["AAA", "BBB", "CCC"];

    return [input.replace(ifind ,ireplace)];
  }

我知道我可以在整个过程中使用循环,但尝试学习新事物,这看起来很有希望,或者至少是一种有趣的方法

谢谢

【问题讨论】:

  • 如果您的目标是学习使用map()forEach() 并且您知道如何使用循环来做您想做的事情,那么我建议您首先使用循环来实现它。如果您不知道如何修改以使用数组方法,请使用您的代码更新您的问题,SO 社区将更有帮助。

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


【解决方案1】:

objectMap 对于一对一关系来说是更好的数据结构。您可以将它与Array#reduce 一起使用来遍历对象中的所有键并逐个替换它以累积结果:

function findReplace_mod1() {
  const ss = SpreadsheetApp.getActiveSheet();
  /*No flat*/ const col = /* [].concat.apply([], */ ss
    .getRange(2, 3, ss.getLastRow())
    .getValues(); /* ) */

  const map = { This: 'AAA', That: 'BBB' };
  const iFinds = Object.keys(map);
  ss.getRange(2, 3, ss.getLastRow()).setValues(col.map(fr));

  function fr(input) {
    return [iFinds.reduce((str, k) => str.replace(k, map[k]), input[0])];
  }
}

/*<ignore>*/console.config({maximize:true,timeStamps:false,autoScroll:false});/*</ignore>*/
function findReplace_mod1() {
  const col = [['This is a cat'], ['This is not That']];
  const map = { This: 'AAA', That: 'BBB' };
  const iFinds = Object.keys(map);
  console.info(col.map(fr));

  function fr(input) {
    return [iFinds.reduce((str, k) => str.replace(k, map[k]), input[0])];
  }
}

findReplace_mod1();
&lt;!-- https://meta.stackoverflow.com/a/375985/ --&gt;    &lt;script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 我喜欢你所做的。我可以关注除return [iFinds.reduce((str, k) =&gt; str.replace(k, map[k]), input[0])] 之外的所有内容,但我会努力解决这个问题。另外,我将使用它与您的出色功能将我的列表合并为一个对象var map = {}; ifind.forEach(function(item, i) { map[item] = ireplace[i]; });谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2021-03-28
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多