【问题标题】:googlesheet Copy & Paste filtered data by column namegooglesheet 按列名复制和粘贴过滤后的数据
【发布时间】:2020-08-02 00:46:45
【问题描述】:

嗨,这个code 效果很好,我已经根据我的要求进行了编辑,但我遇到的问题是我想从“工作表”和“更新”表中按标题名称(Row1)复制列而不是复制& 粘贴整个数据。

这里有几个列标题名称:EmployeeID、Email、Date、Employee name、Phone

toFilter();
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = spreadsheet.getSheetByName("Worksheet");
var sheet2 = spreadsheet.getSheetByName("Update");
var data = sheet1.getDataRange().getValues();
var array = [];
for (var i = 0; i < data.length; i++){
if(sheet1.isRowHiddenByFilter(i+1)==false){
  array.push(data[i]);
}
}
sheet2.getRange(sheet2.getLastRow()+1, 1, array.length, array[0].length).setValues(array);
}

请帮忙!!

【问题讨论】:

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


    【解决方案1】:

    试试这样的:

    //员工ID、邮箱、日期、员工姓名、电话

    function toFilter() {
      var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      var sheet1 = spreadsheet.getSheetByName("Worksheet");
      var sheet2 = spreadsheet.getSheetByName("Update");
      var hA=sheet1.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
      var hObj={};
      hA.forEach(function(e,i){hObj[e]=i;});
      var data = sheet1.getDataRange().getValues();
      var array = [];
      for (var i = 0; i < data.length; i++){
        if(!sheet1.isRowHiddenByFilter(i+1)){
          array.push([data[i][hObj['EmployeeID']],data[i][hObj['Email']],data[i][hObj['Date']]...]);
        }
      }
      sheet2.getRange(sheet2.getLastRow()+1, 1, array.length, array[0].length).setValues(array);
    }
    

    如果您使用数组公式,请尝试这种方式:

    function toFilter() {
      var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      var sheet1 = spreadsheet.getSheetByName("Worksheet");
      var sheet2 = spreadsheet.getSheetByName("Update");
      var hA=sheet1.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
      var hObj={};
      var col='enter column number here'
      hA.forEach(function(e,i){hObj[e]=i;});
      var data = sheet1.getRange(1,1,getColumnHeight(col,sheet1,spreadsheet),sheet1.getLastRow()).getValues();
      var array = [];
      for (var i = 0; i < data.length; i++){
        if(!sheet1.isRowHiddenByFilter(i+1)){
          array.push([data[i][hObj['EmployeeID']],data[i][hObj['Email']],data[i][hObj['Date']]...]);
        }
      }
      sheet2.getRange(sheet2.getLastRow()+1, 1, array.length, array[0].length).setValues(array);
    }
    
    function getColumnHeight(col,sh,ss){
      var ss=ss||SpreadsheetApp.getActive();
      var sh=sh||ss.getActiveSheet();
      var col=col||sh.getActiveCell().getColumn();
      var v=sh.getRange(1,col,sh.getLastRow(),1).getValues().map(function(r){return r[0];});
      var s=0;
      var h=0;
      v.forEach(function(e,i){if(e==''){s++;}else{s=0;}h++;});
      return (h-s);
    }
    

    【讨论】:

    • 非常感谢!但是当我将数组公式放入工作表 A 和 B 列 =ARRAYFORMULA(IF(E2:E="","",IF(COUNTIF(E2:2,E2:E)&gt;1,"Yes","No" 时执行脚本需要超过 2 分钟,但是如果我将相同的公式放入没有数组 =IF(E2:E="","",IF(COUNTIF(E2:2,E2:E)&gt;1,"Yes","No" 的情况下,它会在 10 秒内执行,为什么会这样?如何让它执行得更快?
    • 可能是数组函数弄乱了getDataRange()中的lastRow()计算。我有一个可以使用的 columnHeiight() 函数。你能告诉我哪一列不包含公式吗?我们可以试试看有没有帮助。
    • A 列和 B 列包含上述公式,分别在 E 列和 K 列中查找重复项,S 列包含自定义 UDF,涉及范围从 K 到 R。我不知道是否需要此信息 - 没有列我要复制有公式
    • 你能分享一张你的工作表的图片吗?
    • 这是表格:docs.google.com/spreadsheets/d/… 黄色格式的列包含公式。
    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多