【问题标题】:How to ignore empty cell values for getRange().getValues()如何忽略 getRange().getValues() 的空单元格值
【发布时间】:2017-06-16 01:13:49
【问题描述】:

我可以使用 getValues() 获取范围值,并通过在 Google App Script 中声明以下变量将其放入字符串中

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getSheetByName("Test"); 
var range_input = ss.getRange("A1:A").getValues();

但是,我意识到我的字符串中有很多逗号可能来自所有空调用。

例如,如果值跟随

================
Spreadsheet("Test") Values

A1=abc
A2=def
A3=    
A4=
A5=
A6=uvw
A7=xyz
================

如果我执行 msgBox,它会得到如下所示的内容。

Browser.msgBox(range_input) // results = abc,def,,,,uvw,xyz,,,,,,,,,,,

有没有办法删除尾随逗号,所以我得到如下所示的内容? (即忽略空单元格)

Browser.msgBox(range_input) // results = abc,def,uvw,xyz

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您也可以使用filter()

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Test"); 
    var range_input = ss.getRange("A1:A").getValues();
    var filtered_input = range_input.filter(String);
    

    【讨论】:

    • 嗨,Triple,也感谢您的建议。我试过你的建议,这也确实有效!我喜欢你的代码,因为它非常干净且易于理解。
    • 不客气!哦,感谢您的投票,我现在拥有 50 多个声望,所以我现在终于可以对任何问题发表评论了。
    • 我的荣幸。与您的帮助相比,我的支持是微不足道的 :)
    • 好吧,如果你愿意,你可以选择我的答案作为你的情况的正确答案,这应该足以让我比以前更快乐。
    • 迄今为止的最佳答案。谢谢。
    【解决方案2】:
    • 你想达到以下结果。

      • 输入

        A1=abc
        A2=def
        A3=
        A4=
        A5=
        A6=uvw
        A7=xyz
        
      • 输出

        Browser.msgBox(range_input) // results = abc,def,uvw,xyz
        

    在现阶段,我认为var result = [i for each (i in range_input)if (isNaN(i))]的推导式虽然还可以使用,但不适合tehhowch的评论这种情况。中音我认为filter() 适合这种情况。在此更新中,我想通过提出其他解决方案来更新它。如果这有用,我很高兴。

    模式一:

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Test"); 
    var range_input = ss.getRange("A1:A").getValues();
    var result = range_input.reduce(function(ar, e) {
      if (e[0]) ar.push(e[0])
      return ar;
    }, []);
    Logger.log(result) // ["abc","def","uvw","xyz"]
    Browser.msgBox(result)
    
    • 在此模式中,空行由reduce() 删除。

    模式2:

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Test"); 
    var range_input = ss.getRange("A1:A").getValues();
    var result = [].concat.apply([], range_input).filter(String); // or range_input.filter(String).map(String)
    Logger.log(result) // ["abc","def","uvw","xyz"]
    Browser.msgBox(result)
    
    • 在此模式中,空行被filter() 删除,当使用filter() 时,返回二维数组。为了返回一维数组,数组被展平。

    模式3:

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Test"); 
    var range_input = ss.getRange("A1:A").getValues();
    var criteria = SpreadsheetApp.newFilterCriteria().whenCellNotEmpty().build();
    var f = ss.getRange("A1:A").createFilter().setColumnFilterCriteria(1, criteria);
    var url = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/gviz/tq?tqx=out:csv&gid=" + sheet.getSheetId() + "&access_token=" + ScriptApp.getOAuthToken();
    var res = UrlFetchApp.fetch(url);
    f.remove();
    var result = Utilities.parseCsv(res.getContentText()).map(function(e) {return e[0]});
    Logger.log(result) // ["abc","def","uvw","xyz"]
    Browser.msgBox(result)
    
    • 在此模式中,过滤器会删除空行,然后检索过滤后的值。

    结果:

    参考资料:

    【讨论】:

    • 亲爱的 Tanaike,感谢您的 cmets 并让您赞叹不已 :-) 这正是我想要的!我会立即开始使用您的建议。
    • 再次感谢。抱歉,直到今天我才知道“接受”按钮 :) 现在已被接受。
    • 我不知道 Google Apps 脚本中的列表推导功能!
    • 不应使用数组推导 - 它们是现已弃用的语言功能
    • @tehhowch 感谢您的评论。我没有注意到那种情况。谢谢你让我知道。所以我更新了我的答案。你能确认一下吗?我认为 TripleDeal 的答案应该是已解决的答案。所以我提出了其他模式。
    【解决方案3】:

    没有测试效率,但是为了简单的去除多个,s,可以使用正则表达式:

    const a=[['abc'],['def'],[''],[''],[''],['xyz'],['']];//simulate getValues()
    const out =  a.join(',').replace(/,+(?=,)|,*$/g,'') //'abc,def,xyz'
    const out2 = a.join('«').replace(/«+$/,'').split(/«+/) //flattened
    
    console.log({out, out2})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多