【问题标题】:Select the rows from a Google Spreadsheet where values in a certain column are not empty using Google Apps Scripts使用 Google Apps 脚本从 Google 电子表格中选择某一列中的值不为空的行
【发布时间】:2017-02-02 22:32:54
【问题描述】:

我有一个数据集,这里是它的链接:

https://docs.google.com/spreadsheets/d/1QgR7WC2bj2_AW7yTDnjEXDrYKGo1GR_w_ea-8PtRwm4/edit?usp=sharing

所以我想要的是,如果 A 列中的任何单元格有日期(非空),我想获取整行。

我什至在堆栈溢出中得到了一个脚本:

  function copynotempty(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = SpreadsheetApp.setActiveSheet(ss.getSheets()[0])
  var col = 0 ; // choose the column you want to check: 0 = col A, 1= col B ...
  var range = sh.getDataRange();
  var values=range.getValues();// data is a 2D array, index0 = col A
  var formulas=range.getFormulas();// data is a 2D array, index0 = col A
  var target=new Array();// this is a new array to collect data
   for(n=0;n<range.getHeight();++n){
     if (values[n][col]!=''){ ; 
                for (cc=0;cc<range.getWidth();++cc){
                if (values[n][cc]!=''){target[n][cc]=values[n][cc]}
    // if the cell has a formula copy it or else copy the value, do that for the whole row
// (this also defines and apply the 'priority' you mentioned in your question, I wasn't sure if it should apply to the whole row or only on column B)
                }
              }
            }
            if(target.length>0){// if there is something to copy
          var sh2=SpreadsheetApp.setActiveSheet(ss.getSheets()[1]); //second sheet of your spreadsheet
          sh2.getRange(1,1,target.length,target[0].length).setValues();// paste the selected values in the 2cond sheet
          }
        }

但是如果我将它用于我共享的数据集,我会收到此错误“TypeError:无法将未定义的属性“0.0”设置为“invited”。(第 12 行,文件“代码”)”。

提前致谢。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    下面的脚本怎么样?此脚本仅检索 A 列具有字符串的行。

    虽然您说您想通过 B 列的条件检索行,但您的脚本将 A 列视为条件。因此,如果您使用此示例脚本,请更改“col”。现在“col”是 A 列。

    脚本:

    function copynotempty() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var range = ss.getSheets()[0].getDataRange();
      range.setNumberFormat('@');
      var values = range.getValues();
      col = 0;
      var target = values.filter(function(e, i){return (isNaN(e[col]) && i > 0)});
      ss.getSheets()[1].getRange(1,1,target.length,target[0].length).setValues(target);
    }
    

    结果:这被导入到 sheet2。

    [[22/1/16, 2/2/16, 3/2/16, 3/2/16, 6/2/16],
    [13/1/16, 13/1/16, 13/1/16, 13/1/16, 20/1/16],
    [2/2/16, 2/2/16, 2/2/16, 2/2/16, 9/2/16],
    [1/2/16, 1/2/16, 8/3/16, 14/3/16, 2/5/16],
    [11/1/16, 11/1/16, 11/1/16, , ],
    [12/2/16, 12/2/16, 12/2/16, 12/2/16, 20/2/16],
    [28/1/16, 28/1/16, 28/1/16, , ],
    [6/1/16, 6/1/16, 6/1/16, 6/1/16, 15/1/16],
    [25/1/16, 25/1/16, 25/1/16, 25/1/16, 13/2/16],
    [30/1/16, 3/2/16, 10/2/16, 10/2/16, 14/2/16],
    [27/1/16, 27/1/16, 27/1/16, 27/1/16, 8/2/16],
    [15/1/16, 23/1/16, 23/1/16, 23/1/16, 29/1/16],
    [12/1/16, 12/1/16, 12/1/16, 12/1/16, 16/1/16],
    [2/2/16, 3/2/16, 3/2/16, 3/2/16, 6/2/16],
    [18/12/15, 5/1/16, 5/1/16, 5/1/16, 12/1/16]]
    

    【讨论】:

    • 非常感谢脚本。但是例如,如果我在 sheet1 中有数据集,并且如果我尝试通过在 sheet2 中写入“=copynotempty(Sheet1!A:E)”来使用脚本,该脚本为空,则会引发错误“您无权调用 setNumberFormat (第 4 行)。”你知道为什么会这样吗?
    • 更新了示例脚本。它将结果导入到 sheet2。
    • 也谢谢你。您可以按接受按钮来回答您的这个问题吗?
    猜你喜欢
    • 2012-06-25
    • 2017-02-13
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多