【问题标题】:Array comparison in Google spreadshetGoogle 电子表格中的数组比较
【发布时间】:2015-10-02 17:13:19
【问题描述】:

如果“Final”表中不存在“Longlist”表中的数据,我正在尝试编写一个脚本,该脚本将“Longlist”表中的数据复制到“Final”表(onEdit)。

下面的代码成功地将数据从工作表复制到工作表,但是当函数再次运行时,即使数据存在于最终工作表中,它也会复制数据并创建重复行。

如果有人能提供帮助,我会很高兴。

注意:Google sheet 不支持 - data[i].equals(data2[z]) 或 vlookup inside script

function onEdit() {
    var ss= SpreadsheetApp.getActive();  
    var sheet = ss.getSheetByName("Longlist New");
    var sheet2 = ss.getSheetByName("Final List");
    var data = sheet.getRange('a1:a100').getValues();  // Long List - Names
    var data2 = sheet2.getRange('c2:c50').getValues(); // Final List - Names
    for (var i=1; i<=data.length; i++)                         {
        for (var z=0; z<=data2.length; z++) {   
            if (data [i] == data2 [z]) {
                x=1;
            } 
        } 
        if (x != 1)    {   
            a= sheet2.getLastRow();
            b= sheet2.getLastColumn(); 
            sheet2.getRange(a+1,12).setValue(sheet.getRange(i+1,9).getValue());   
            ...
            ..
        }
    }
}

【问题讨论】:

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


    【解决方案1】:
    var dataToCopy = data.reduce (function(a,b)   { return a.concat(b) })
                         .filter (function(e,i,a) { return this.indexOf(e) == -1 },
                            data2.reduce( function(a,b) { return a.concat(b) }))
    
                         .filter (function(e,i,a) { return a.indexOf(e) === i })
                         .map    (function(e,i,a) { return [e] });
    

    目标

    在 data2 中找到尚未存在的元素。

    操作方法

    1. 从技术上讲,列数组是数组的数组。 .reduce 结合 .concat 将有效地将“一维”列数组转换为真正的一维行数组。

    2. .filter 用于仅查找 data2 中不存在的数据中的元素。在这种情况下,data2 是过滤器函数的 thisArg,并且在过滤器中由“this”象征性地表示。记下过滤器行末尾的“,”。 data2 函数(就像我们对 data1' 所做的那样被转置)被调用到那里的过滤器函数中,并且可以留在同一行。

      .indexOf 用于检查 data 中的每个元素是否存在于 data2 中,如果元素不存在则返回 -1。这将为 data1 中的每个元素返回真/假,并且过滤器将删除所有测试为假的元素。此时 dataToCopy 是一个数组,只包含 data2 中没有的元素。

    3. 此过滤器将删除 dataToCopy 中的重复值。 indexOf 返回元素所在的第一个索引。如果该索引不等于当前元素的索引,则该元素是重复的。这让我们只剩下 dataToCopy 中的唯一值。如果允许重复值,则可以删除此过滤器。

    4. 将 dataToCopy 转换回列数组。现在可以将其发送回电子表格。

    【讨论】:

    • 嗨,汤姆,感谢您详细解释的回答。但是,很遗憾,Google Script 不支持 Object.Reduce、Filter、Concat、..() 方法
    • 我在我的谷歌脚本项目中经常使用所有这些方法。您是否使用附加到电子表格的脚本?执行记录是否记录了错误?我在发布之前测试了代码 sn-p,一切看起来都不错。
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2013-07-11
    • 2017-06-09
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多