将非空范围复制到新工作表中,然后向下拖动公式

时间:2016-10-07 05:15:16

标签: google-apps-script google-sheets

  1. 我想从工作表“合并工作表”中复制A / B列中的所有非空单元格,然后将这些单元格粘贴到工作表“输入Web应用程序”中的H:I列中(始终从顶部,而不是将它们作为新行附加,因为这些值将不断更新。

  2. 然后我基本上想要将其他列(A到G)中的所有公式一直向下拖动到最后一行粘贴。

  3. 将第I列格式化为日期。

  4. 我不确定我是否需要循环来执行此操作或仅需要一个数组。我已经尝试过两种方式,但不断出错。

    选项1:在这里我得到了这个错误:

      

    TypeError :( class)@ 2e3b19c不是函数,它是对象。

    function copynotempty(){
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("CONSOLIDATION SHEET");
      var col = 0 ; // choose the column you want to check: 0 = col A, 1= col B ...
      var lastrow = ss.getLastRow();
      var range = ss.getRange(5,1,lastrow-4,2);
      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()!=''|| formulas()!=''){ ;  (
               var sh2=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Inputs for Web App"); //target sheet of the spreadsheet
               range.copyTo(sh2.getRange(4,8,range.height,range[0].length),{contentsOnly:true});
                  }
                }
    

    选项2:在这里我不断收到此错误:

      

    “TypeError:无法将未定义的属性”0.0“设置为”(VALUE OF   CELL)“

    function copynotempty(){
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("CONSOLIDATION SHEET");
      var col = 0 ; // choose the column you want to check: 0 = col A, 1= col B ...
      var lastrow = ss.getLastRow();
      var range = ss.getRange(5,1,lastrow-4,2);
      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]!=''|| formulas[n][col]!=''){ ;
            for (cc=0;cc<range.getWidth();++cc){
                    if (values[n][cc]!=''){target[n][cc]=values[n][cc]} // if the cell has a value, copy it  
                    }
                  }
                }
                if(target.length>0){// if there is something to copy
                  var sh2=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Inputs for Web App"); //second sheet of your spreadsheet
              sh2.getRange(4,8,target.height,target[0].length).setValues();// paste the selected values in the 2cond sheet
              }
            }
    

1 个答案:

答案 0 :(得分:1)

在第一个函数中,您的问题是您尝试调用values()formulas(),它们都是2d字符串数组。

移动数据(这是目前你在函数中唯一要做的事情)可以这样做:

function copynotempty(){
  var ss = SpreadsheetApp
      .getActiveSpreadsheet()
      .getSheetByName("CONSOLIDATION SHEET");

  var lastrow = ss.getLastRow();
  var range = ss.getRange(5,1,lastrow-4,2);

  var nonEmpty = range
      .getValues()
      .filter(function(row) {           // filter matrix for rows
        return row.some(function(col) { // that have at least one column
          return col !== "";});});      // that is not empty

  if (nonEmpty) {
    var sh2=SpreadsheetApp
        .getActiveSpreadsheet()
        .getSheetByName("Inputs for Web App");

    sh2.getRange(4,8, nonEmpty.length, nonEmpty[0].length)
       .setValues(nonEmpty);
  }
}
  1. 这可以用数组公式解决吗?
  2. 最好将列格式设置为您选择的dtae格式,或者您想要一个字符串吗?