Скрипт приложений Google Sheets — Как добавить Arrayformula и несколько связанных функций IF в сценарий (без отображения формулы в пользовательском интерфейсе)

#if-statement #google-apps-script #google-sheets #array-formulas

Вопрос:

Мне было интересно, может ли кто-нибудь помочь?

Я пытаюсь добавить Arrayformula, состоящую из двух функций IF, поэтому я хочу объединить следующие две формулы в одну ячейку:

  1. =ARRAYFORMULA(ЕСЛИ(D13:D104=»»,»»,(ЕСЛИ(K13:K104,K13:K104*20,»$0″))))
  2. =ARRAYFORMULA(ЕСЛИ(D105:D=»»,»»,(ЕСЛИ(K105:K,K105:K*C4,»$0″))))

Таким образом, первый раздел листа нужно умножить на 20, а затем цифра изменилась и должна быть умножена на 25 (это ячейка C4).

  1. Можно ли объединить их в одну ячейку, содержащую Arrayformula две функции IF (или есть другой/более простой способ для этого)
  2. Можно ли добавить это в скрипт Google Apps, чтобы он работал в бэкэнде (так что это не просто скрипт, который применяет формулу в ячейку, но не отображается во внешнем интерфейсе или на листе)
  3. Более общий вопрос — При использовании Arrayformula с IF; и, например, выводится определенный текст, например, «Тест завершен», связанный с диапазоном F2:F (проверка, содержит ли E2:E определенную фразу, например, «Готово») — для пустых ячеек между ними (из-за установки ложного результата как «») возможно ли каким-либо образом случайным образом добавлять данные в эти пустые ячейки, не прерывая формулу? (поэтому у меня есть опция автоматического текста, если в ячейке слева указан определенный термин/слово, но все еще есть возможность вручную добавлять случайные данные в пустые ячейки)

Любая помощь будет весьма признательна

Ответ №1:

Что касается 1-го и 2-го вопросов: это похоже на задачу для пользовательской функции. Что-то вроде этого:

 function MULTI() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell = sheet.getActiveCell();
  var row = cell.getRow();
  var value = sheet.getRange('K' row).getValue();
  return (row < 105) ? value * 20 : value * 25;
}
 

Он получает значение из столбца K и умножает его на 20, если строка меньше 105, и на 25 для остальных строк.

введите описание изображения здесь

Вот вариант той же формулы, в которой используется ячейка «C4»:

 function MULTIC4() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell = sheet.getActiveCell();
  var row = cell.getRow();
  var value = sheet.getRange('K' row).getValue();
  var c4 = sheet.getRange('C4').getValue();
  return (row < 105) ? value * 20 : value * c4;
}
 

И это можно сделать с помощью триггера onEdit() :

 function onEdit(e) {
  var col = e.range.columnStart;
  if (col != 11) return; // 11 = K

  var sheet = e.source.getActiveSheet();
  if (sheet.getName() != 'Sheet1') return;

  var c4 = sheet.getRange('C4').getValue();
  var row = e.range.rowStart;
  var dest_cell = sheet.getRange('D' row);
  var value = sheet.getRange(row,col).getValue();
  var result = (row < 105) ? value * 20 : value * c4;
  dest_cell.setValue(result);
}
 

Он автоматически пересчитывает значение в ячейке столбца » D «(текущая строка) каждый раз, когда вы меняете значение в ячейке столбца «K». На листе «Лист1».

Комментарии:

1. Я действительно ценю вашу помощь, спасибо @Юрий Христич, вы случайно не знаете, как объединить это в «Arrayformula» (для внешнего интерфейса листа)? Попробовал оба ваших предложения, и они работают идеально, но поскольку связанные ячейки содержат данные, которые были добавлены с помощью формулы, скрипт не распознает ввод как «редактировать», поэтому я думаю, что, вероятно, будет проще использовать формулу внутри ячейки. Я пробовал различные комбинации, ЕСЛИ ЕСЛИ, но по какой-то причине я просто не могу заставить это работать. Кроме того, я многому научился из вашего ответа, так что большое вам спасибо.

2. Увы, у меня недостаточно знаний о формулах массивов, и они мне не нравятся, потому что выглядят крайне некрасиво :). Я даже не знаю, возможно ли это (изменить вывод на основе номера строки, я полагаю) в формуле массива. Так что тебе нужен другой парень, чтобы помочь тебе.