#if-statement #google-apps-script #google-sheets #array-formulas
Вопрос:
Мне было интересно, может ли кто-нибудь помочь?
Я пытаюсь добавить Arrayformula, состоящую из двух функций IF, поэтому я хочу объединить следующие две формулы в одну ячейку:
- =ARRAYFORMULA(ЕСЛИ(D13:D104=»»,»»,(ЕСЛИ(K13:K104,K13:K104*20,»$0″))))
- =ARRAYFORMULA(ЕСЛИ(D105:D=»»,»»,(ЕСЛИ(K105:K,K105:K*C4,»$0″))))
Таким образом, первый раздел листа нужно умножить на 20, а затем цифра изменилась и должна быть умножена на 25 (это ячейка C4).
- Можно ли объединить их в одну ячейку, содержащую Arrayformula две функции IF (или есть другой/более простой способ для этого)
- Можно ли добавить это в скрипт Google Apps, чтобы он работал в бэкэнде (так что это не просто скрипт, который применяет формулу в ячейку, но не отображается во внешнем интерфейсе или на листе)
- Более общий вопрос — При использовании 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. Увы, у меня недостаточно знаний о формулах массивов, и они мне не нравятся, потому что выглядят крайне некрасиво :). Я даже не знаю, возможно ли это (изменить вывод на основе номера строки, я полагаю) в формуле массива. Так что тебе нужен другой парень, чтобы помочь тебе.