Передача ссылок на ячейки функциям электронных таблиц

Когда я вызываю функцию электронной таблицы, скажем int(f2), функция работает со значением в ячейке. Если cell("F2") содержит 3,14159, результатом будет 3. Но когда я вызываю другой тип функции, например: row(f8), функция принимает ссылку на ячейку, а не значение, в данном случае возвращая 8.

Как заставить мою пользовательскую функцию работать со ссылкой, а не со значением?

Я могу передать строку и использовать getRange(), но если я перемещу или обновлю ячейки на листе, строки не изменятся.

Действительно простой пример:

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

С помощью этого кода в моем листе я могу получить формулу в C4 следующим образом: =GetFormula("C4")

Но этот аргумент является строкой, и я бы предпочел передать ссылку на ячейку. Несколько более сложная проблема требует обновления вызывающих ячеек при копировании и вставке.

Любые идеи?


person HardScale    schedule 30.08.2012    source источник
comment
Вот обходной путь, а не решение - =GetFormula(ADDRESS(ROW(F8), COLUMN(F8)))   -  person megabyte1024    schedule 31.08.2012
comment
Это будет делать то, что я хочу, но, мальчик, это некрасиво! Теперь я должен объяснить это всем, кто это видит, понимаете?   -  person HardScale    schedule 06.09.2012
comment


Ответы (3)


(Из моего ответа о веб-приложениях.) Можно получить ссылку на переданный диапазон, проанализировав формулу в активной ячейке. , которая является ячейкой, содержащей формулу. Это предполагает, что пользовательская функция используется сама по себе, а не как часть более сложного выражения: например, =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;
}
person Community    schedule 22.06.2016

Я работал над этим несколько месяцев назад и придумал очень простой кладж: создать новый лист с именем каждой ячейки в качестве ее содержимого: ячейка A1 может выглядеть так:

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

РЕДАКТИРОВАТЬ: вышеуказанное больше не работает. Моя новая формула «Ref»! A1 -

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

Назовите лист Ref. Затем, когда вам нужна ссылка на ячейку в виде строки вместо содержимого, вы используете:

= some_new_function('Ref'!C45)

Конечно, вам нужно будет проверить, передает ли функция строку (одну ячейку) или 1D или 2D массив. Если вы получите массив, он будет иметь все адреса ячеек в виде строк, но по первой ячейке, ширине и высоте вы сможете определить, что вам нужно.

person HardScale    schedule 11.06.2016
comment
вы можете просто передать cell (address, a1: z500) пользовательской функции, а затем эта функция может получить cell аргумент строки чтения объекта в качестве адреса ячейки, нет необходимости в дополнительном листе - person mvidelgauz; 02.10.2016
comment
Я заметил, что в ОП. Строки не обновляются при перемещении ячеек. - person HardScale; 02.10.2016
comment
Не уверен, что вы имеете в виду. Я только что реализовал функцию, которую называю так: MyFunc (CELL (address, D17)), и она работает, когда я перемещаю целевую ячейку ... - person mvidelgauz; 02.10.2016
comment
Когда я использую ваше решение в массиве из нескольких ячеек, я получаю только адрес верхней левой ячейки, поэтому я обновил свой ответ, включив в него фактическую рабочую формулу. - person HardScale; 08.10.2016

Когда вы передаете диапазон пользовательской функции, параметр имеет тип Range, который можно затем используйте выборку значений и т. д.

Изменить: это неверно.

person Eric Koleda    schedule 05.09.2012
comment
Это правда, если я вызываю функцию из другой функции. Но если я использую функцию в электронной таблице, ссылка на аргумент автоматически отменяется в содержимом ячейки. Если бы вы могли дать мне пример формулы электронной таблицы, которая вызывает пользовательскую функцию и может передать этой функции Range, я был бы очень благодарен. - person HardScale; 06.09.2012
comment
Приношу свои извинения, я неправильно понял, как был пройден диапазон. Вы правы, передаются только значения. - person Eric Koleda; 07.09.2012