通过单元格引用到电子表格功能(passing cell references to spreadsh

2019-06-17 23:00发布

当我打电话电子表格功能,说int(f2)该函数在单元格中的数值进行操作。 如果cell("F2")中含有3.14159,其结果将是3。但是,当我调用不同类型的功能-例如: row(f8) -该功能将单元格引用,而不是价值,在这种情况下,返回8。

如何让我的自定义函数与参考,而不是价值的工作?

我可以通过一个字符串,并使用getRange()但是,如果我移动或更新在纸张上的细胞时,字符串将不会改变。

很简单的例子:

function GetFormula(cellname) {
  return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula();
}

与这在我的片的代码,我可以检索在式C4这样的: =GetFormula("C4")

但是,这个参数是一个字符串,我宁愿传递一个单元格引用。 一个较为复杂的问题,需要呼叫细胞复制和粘贴时更新。

有任何想法吗?

Answer 1:

(从我的答案上Web应用程序。)人们可以通过在活性细胞,其是含有公式的单元格解析公式得到的传递范围的参考。 这使得该自定义函数用于其自身,并假定不作为更复杂的表达式的一部分:例如, =myfunction(A1:C3)=sqrt(4+myfunction(A1:C3))

该方法还支持其他片材,如引用=myfunction(Sheet2!A3:B5)=myfunction('Another Sheet'!B3:G7)

作为演示,此函数返回的传递范围的第一列索引。 此位为函数的最末端; 大多数的它涉及范围提取。

function myfunction(reference) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i)[1].split('!');
  try {
    if (args.length == 1) {
      var range = sheet.getRange(args[0]);
    }
    else {
      sheet = ss.getSheetByName(args[0].replace(/'/g, ''));
      range = sheet.getRange(args[1]);
    }
  }
  catch(e) {
    throw new Error(args.join('!') + ' is not a valid range');
  }

  // everything so far was only range extraction
  // the specific logic of the function begins here

  var firstColumn = range.getColumn();  // or whatever you want to do with the range
  return firstColumn;
}


Answer 2:

我工作的这几个月前,用一个非常简单的杂牌想出了:每一个小区作为其内容的名称创建一个新的工作表:单元格A1可能看起来像:

= arrayformula(cell("address",a1:z500))

编辑:以上不再起作用。 我对“参考”新的公式!A1是

= ArrayFormula(char(64+column(A1:Z100))&row(A1:Z100))

命名表“参考”。 然后,当你需要一个小区作为一个字符串,而不是内容的参考,您可以使用:

= some_new_function('Ref'!C45)

当然,你需要检查函数会得到一个字符串(一个单元)或一维或二维数组。 如果你得到一个数组,它将拥有所有的单元格地址字符串,而是来自第一小区和宽度和高度,你可以计算出你所需要的。



Answer 3:

当你传递一个范围内的自定义功能的参数的类型的范围 ,然后可以使用获取的值等

编辑 :这不正确。



文章来源: passing cell references to spreadsheet functions