Как посчитать количество формул в документе Google Sheets? - PullRequest
3 голосов
/ 31 марта 2020

Есть ли способ подсчитать количество формул в сложных листах Google? c (с несколькими вкладками)

Я переработал старый шаблон, используя такие функции, как ARRAYFORMULA и так далее, и мне бы очень хотелось определить уменьшение сложности - количество формул, являющихся одним прокси для этого. Первоначально было много тысяч построчных, столбцовых-столбцовых копий / вставок.

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

Используйте getFormulas, чтобы получить все формулы и сосчитать все непустые элементы:

const getTotalFormulasCount = () =>
  console.log(getNumFormulas_(SpreadsheetApp.getActive().getSheets()));

/**
 * @param {GoogleAppsScript.Spreadsheet.Sheet[]|string[][]|string[]} arr Array of sheets or 1D or 2D array of formulas
 * @returns {number} count of formulas present in arr
 */
const getNumFormulas_ = arr =>
  arr.reduce(
    (count, el) =>
      count +
      (Array.isArray(el) //if el is array, recurse
        ? getNumFormulas_(el)
        : el.getRange //if el is sheet, recurse over it's formulas
        ? getNumFormulas_(el.getDataRange().getFormulas())
        : Number(el !== '')),
    0
  );

2 голосов
/ 01 апреля 2020

Я понимаю, что вы хотите получить количество ячеек, включая формулы на всех листах в электронной таблице Google. Если мое понимание правильное, я хотел бы предложить использовать скрипт Google Apps. Так как насчет этого примера сценария?

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

Шаблон 1:

В этом шаблоне все листы извлекаются из активной электронной таблицы, а количество ячеек, включая формулы, извлекается из каждый лист. Для подсчета количества элементов двумерный массив выровнен.

Пример сценария:

function myFunction() {
  const res = SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheets()
    .reduce((n, s) => n += s.getDataRange().getFormulas().flat().filter(String).length, 0);
  console.log(res)
}

Шаблон 2:

В этом шаблоне формулы получено с помощью TextFinder. В этом случае все формулы можно извлечь из всех листов активной электронной таблицы без использования процесса l oop. Детальный процесс поиска выполняется на внутреннем сервере Google. В моей среде было обнаружено, что стоимость процесса для этого шаблона была ниже, чем для шаблона 1. При тех же условиях стоимость шаблона 2 составляла примерно 1/5 от стоимости шаблона 1.

Пример сценария:

function myFunction() {
  const res = SpreadsheetApp
    .getActiveSpreadsheet()
    .createTextFinder("^\\=")
    .matchFormulaText(true)
    .useRegularExpression(true)
    .findAll().length;
  console.log(res)
}

Примечание:

  • Оба шаблона возвращают одинаковый результат.
  • Пожалуйста, запустите сценарий с включением V8.

Ссылки:

Если я неправильно понял ваш вопрос, и это не было направление, которое вы хотите, я прошу прощения.

2 голосов
/ 31 марта 2020

Ответ:

Вы можете получить все формулы во всех ячейках всех листов и добавить одну к счетчику, если ячейка начинается с символа =.

Код:

function getAllFormulae() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var count = 0;

  for (var i = 0; i < ss.length; i++) {
    var currSheetValues = ss[i].getDataRange().getFormulas();
    for (var j = 0; j < currSheetValues.length; j++) {
      for (var k = 0; k < currSheetValues[j].length; k++) {
        if (currSheetValues[j][k].startsWith("=") == 1) {
          count++
        }
      }
    }
  }  
  return count;  
}

Я надеюсь, что это полезно для вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...