Passing cell references to spreadsheet functions

前端 未结 3 1531
误落风尘
误落风尘 2020-11-29 09:15

When I call a spreadsheet function, say int(f2), the function operates on the value in the cell. If cell(\"F2\") contains 3.14159, the result would

相关标签:
3条回答
  • 2020-11-29 10:05

    When you pass a range to a custom function the parameter is of type Range, which you can then use the fetch the values, etc.

    Edit: This in incorrect.

    0 讨论(0)
  • 2020-11-29 10:08

    (From my answer on Web Apps.) One can get a reference to the passed range by parsing the formula in the active cell, which is the cell containing the formula. This makes the assumption that the custom function is used on its own, and not as a part of a more complex expression: e.g., =myfunction(A1:C3), not =sqrt(4+myfunction(A1:C3)).

    The method also supports references to other sheets, such as =myfunction(Sheet2!A3:B5) or =myfunction('Another Sheet'!B3:G7).

    As a demo, this function returns the first column index of the passed range. This bit is at the very end of the function; most of it deals with range extraction.

    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;
    }
    
    0 讨论(0)
  • 2020-11-29 10:10

    I was working on this a few months ago and came up with a very simple kludge: create a new sheet with the name of each cell as its contents: Cell A1 could look like:

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

    EDIT: The above no longer works. My new formula for 'Ref'!A1 is

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

    Name the sheet "Ref". Then when you need a reference to a cell as a string instead of the contents, you use:

    = some_new_function('Ref'!C45)
    

    Of course, you'll need to check if the function gets passed a string (one cell) or a 1D or 2D Array. If you get an array, it will have all the cell addresses as strings, but from the first cell and the width and height, you can figure out what you need.

    0 讨论(0)
提交回复
热议问题