如何根据动态范围调用函数?

时间:2016-10-27 18:28:21

标签: javascript google-apps-script

我正在尝试基于DYNAMIC RANGE运行PROPAGATEFORMULAE函数(请参阅下面的代码)(即我的行数和列数可能会不断变化)。

但是每当我运行它时,脚本都会执行(参见execution transcript),但似乎没有调用PROPAGATEFORMULAE函数。我不确定我做错了什么。每当我将STATIC值设置为范围时,该功能都有效,但我想让它们保持动态。

function myFunction() {

  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Looping columns");
  var lastrow = sh.getLastRow();
  var numrows = lastrow;
  var lastcol = sh.getLastColumn();
  var numcols = lastcol;
  var range = sh.getRange(1,1,numrows,numcols);
  sh.setActiveRange(range);

  return propagateFormulae(range);

}

function getCellFromSheet(row,col,sheet){
  return SpreadsheetApp.getActiveSpreadsheet().getSheets()[sheet].getRange(row,col);
}

function propagateFormulae(rows, cols, currentSheet){
  for(var i=1;i<=cols;i++){
    for(var j=2;j<=rows;j++){
      if(getCellFromSheet(j,i,currentSheet).getValue().length == 0)
        getCellFromSheet(j-1,i,currentSheet).copyTo(getCellFromSheet(j,i,currentSheet));
      else{
        j=rows;
     }
    }
   }
  }

enter image description here

2 个答案:

答案 0 :(得分:1)

你缺少2个预期功能的变量:

cols, currentSheet

开:

return propagateFormulae(range);

功能

function propagateFormulae(rows, cols, currentSheet){

<强>更新 如果range对象具有运行函数传播所需的变量,则需要在函数

中获取对象的值
return propagateFormulae(range);

像:

function propagateFormulae(range){//expected variable and object

r=$this->range.rows;
c=$this->range.cols;
cs=$this->range.currentSheet;

如果不是对象,则需要发送所有变量。

答案 1 :(得分:0)

我能够做到这一点并且有效:

function myFunction() {

  var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Looping columns");
  var lastrow = sh.getLastRow();
  var numrows = lastrow;
  var lastcol = sh.getLastColumn();
  var numcols = lastcol;
  var range = sh.getRange(1,1,numrows,numcols);
  sh.setActiveRange(range);

  return propagateFormulae(numrows, numcols, sh);

}

function propagateFormulae(rows, cols){

  for(var i=1;i<=cols;i++){
    for(var j=2;j<=rows;j++){
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Looping columns");
      if(sh.getRange(j,i).getValue().length == 0)
        sh.getRange(j-1,i).copyTo(sh.getRange(j,i));
      else{
        j=rows;
     }
    }
   }
  }