【问题标题】:Remove un-wanted delimiters from concatenation function google script从连接函数谷歌脚本中删除不需要的分隔符
【发布时间】:2018-06-16 20:57:46
【问题描述】:

我正在尝试连接由, 分隔的两列并将结果回发到第三列

我得到:

colA     colb      concatenated
aa bb    ww ww     aa bb, ww ww
mm                 m, 
         qq         ,qq
zz oo              zz oo, 
                   ,
ss       vv zz     ss, vv zz

如何删除不需要的分隔符和空格,以便我得到:

colA     colb      concatenated
aa bb    ww ww     aa bb, ww ww
mm                 mm
         qq        qq
zz oo              zz oo

ss       vv zz     ss, vv zz

如果有帮助,这里有一个包含一些数据的 Google 表格 https://docs.google.com/spreadsheets/d/12Hn9bVy5GmRTVxMcrZ_bdkVSlfrem-Jr4cyev_gg6BE/edit?usp=sharing

谢谢

function ConCat() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Elements");
var lc = sheet.getLastColumn();
var lr = sheet.getLastRow();
var values = sheet.getRange(2, 1, lr,lc).getValues();
var result = [];                                      //Create a empty array to be filled concatenated elements

//Add items to results
for(var i=0; i<lr; i++){
   result[i] = [values[i][0]+", "+values[i][1]];
}

//Post back to column 3 starting on row 2
sheet.getRange(2, 3, lr, 1).setValues(result);
}

【问题讨论】:

  • 你不想使用join (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…) 而不是自己实现吗?
  • 是的,那将是 great,但如何加入两列,而不仅仅是一个列表,当我认为两个单元格都为空时,这仍然会给我留下 ,
  • 在下面查看我的答案:诀窍是在调用 join 之前删除空字符串。然后[].join(', ') 只返回一个空字符串""
  • @JawguyChooser fencepost 没有标签摘录/wiki。这个标签如何帮助这个问题?
  • @Rubén 我是标签系统的新手,但我认为fencepost 标签指的是计算机科学中的fencepost 问题(en.wiktionary.org/wiki/fencepost_problem)。如果不正确,我们可以删除标签。

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


【解决方案1】:

我跳过了谷歌电子表格的内容,因为我认为它实际上与回答你的问题无关。

看起来values 包含您要加入的项目。我将它重命名为vals(因为values 已经是一个绑定函数)并且刚刚在firefox 的javascript 控制台中对其进行了测试。如果 vals 包含空字符串(像这样):

vals = [ ['aa bb', 'ww ww'], ['mm', ''], ['', 'qq'], ['zz oo', ''], 
         ['', ''], ['ss', 'vv zz'] ];

然后我可以使用join 重现您的问题(比您手动实现的版本更易于阅读):

>> for (var i=0; i<vals.length; i++)  
    console.log(vals[i].join(','))
aa bb,ww ww 
mm, 
,qq 
zz oo, 
, 
ss,vv zz

所以,实际上你只是想在加入之前过滤你的空字符串列表:

>> filterEmpties = function(acc, el) {
       if(el != "")
           acc.push(el);
       return acc;
   }
>> for (var i=0; i<vals.length; i++){
    console.log(
        vals[i].reduce(filterEmpties, []).join(', '))
   }
aa bb, ww ww
mm
qq
zz oo

ss, vv zz

我认为这基本上就是您想要实现的目标,对吧?在使用join 之前,我使用Array.prototype.reduce 删除了空元素。

干杯!

编辑:

似乎我对控制台的使用在实施我的答案时造成了一些混乱。我会将我的解决方案与您的代码集成以帮助您了解我的意思(我修复了您的缩进;)):

var filterEmpties = function(acc, el) {
    if(el != "")
        acc.push(el);
    return acc;
}

function ConCat() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet()
        .getSheetByName("Elements");
    var lc = sheet.getLastColumn();
    var lr = sheet.getLastRow();
    var values = sheet.getRange(2, 1, lr,lc).getValues();
    var result = [];  // Create a empty array to be filled concatenated elements

    // Add items to results
    for(var i=0; i<values.length; i++){
        result[i] = values.reduce(filterEmpties, []).join(', ');
    }          
    // Post back to column 3 starting on row 2
    sheet.getRange(2, 3, lr, 1).setValues(result);
}

假设我正确理解了您的输入,这就是您应该做的所有事情。希望这会有所帮助。

【讨论】:

  • JawguyChooser,谢谢,我尝试实现这个可能没有正确执行,因为我不确定如何组合两列来获得vals 尝试vals = sheet.getRange(2, 1, lr,2).getValues(); colA 和 colB。然后回发有sheet.getRange(2, 3, lr, 1).setValues([vals]);,但我收到错误Incorrect range height, was 1 but should be 190
  • @Tim 我只是想创建一个最小的示例,而不必涉足谷歌电子表格领域。据我所知,您的values 与我在vals 中写的结构完全相同。您的原始代码应该适用于我的解决方案。只需定义filterEmpties 函数,然后说values 我在你的for 循环中说vals
  • @TIm 我的解决方案与@Ed Nelson 建议的基本相同,但我使用了joinreduce 等内置函数,以使您的代码更简单、更清晰。
【解决方案2】:

试试这个:

function ConCat() {
var sheet = 
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Elements");
var lc = sheet.getLastColumn();
var lr = sheet.getLastRow();
var values = sheet.getRange(2, 1, lr,lc).getValues();
var result = [];                                      //Create a empty array to be filled concatenated elements

//Add items to results
for(var i=0; i<lr; i++){
 if(values[i][0]!='' && values[i][1]!=''){
    result[i] = [values[i][0]+", "+values[i][1]];
}
  else if(values[i][0]!='' && values[i][1]==''){
    result[i] = [values[i][0]]
}
else if(values[i][0]=='' && values[i][1]==''){
    result[i] = [values[i][1]]
}  
 else{                 
   result[i]=['']
}
}  
//Post back to column 3 starting on row 2
sheet.getRange(2, 3, lr, 1).setValues(result);
}

【讨论】:

    【解决方案3】:
    result[i] = [!values[i][0]? 
        !values[i][1]?"":values[i][1]
      :!values[i][1]? values[i][0]:
        values[i][0] + ", " + values[i][1]];
    

    而不是: 结果[i] = [values[i][0]+", "+values[i][1]];

    【讨论】:

    • ScampMichae,谢谢,这个也很好用,不太懂所以研究一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2014-01-09
    • 2015-08-09
    • 1970-01-01
    相关资源
    最近更新 更多