#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-таблицы
Вопрос:
Я хочу ввести числа, и пусть листы вычисляют процент изменения в той же ячейке. Например:
20 октября | 20 ноября | 20 декабря |
---|---|---|
90 | 100 ( 10%) | 95 (-5%) |
Есть ли способ сделать это без использования дополнительных ячеек для вычисления процентного изменения предыдущего месяца? Если нет, то как лучше всего это сделать? Я предполагаю, что что-то в формате ячейки..
Комментарии:
1. поделитесь копией вашего листа с примером желаемого результата
2. Я привел пример выше. думаю, это не так ясно. Я вручную вводил значения 90, 100, 95 в каждой ячейке каждый месяц, и я хочу, чтобы таблицы вычисляли процентное изменение по сравнению с предыдущим месяцем
3. Я думаю, вы могли бы сделать это только с помощью скрипта, запускаемого путем редактирования ячейки. Скрипт примет значение, которое вы только что ввели, и заменит его строкой, состоящей из нового значения плюс процентное изменение по сравнению с предыдущим месяцем. Я бы подумал, что было бы предпочтительнее иметь процентное изменение в отдельном, но смежном столбце, для любого «представления отчетов» вы могли бы затем объединить их, но не объединять их в вашем листе ввода данных. Но у вас должны быть свои причины.
4. Ячейка не может содержать как ручной ввод, так и вычисление. Одно или другое.
5. Вы можете сделать это с помощью триггера @MattKing
Ответ №1:
Объяснение:
Очевидно, что вам нужен триггер onEdit, который будет запускать некоторый код всякий раз, когда вы меняете значение определенных ячеек на определенном листе.
Следующий сценарий:
- Активируется при редактировании ячейки в любом столбце, кроме for
A
(который содержит начальное значение). - Он рассчитает процентную разницу на основе этой формулы:
- Это вернет желаемое выражение обратно в отредактированную ячейку.
Обновленное решение:
function onEdit(e) {
const as = e.source.getActiveSheet(); // get active sheet
const rng = e.range;
const row = rng.getRow(); // get edited row
const col = rng.getColumn(); // get edited column
const new_val = rng.getValue(); // get new value
if (as.getName() == "Sheet1" amp;amp; col > 1 amp;amp; row > 1){
if(new_val!=''){
let old_val = as.getRange(row,col-1).getValue();
if(col>2){
old_val = parseInt(old_val.substr(0, old_val.indexOf(' (')));
}
let c = Math.round(100*(new_val-old_val)/old_val);
rng.setValue(`${new_val} (${c}%)`);
}
else{rng.clearContent();}
}
}
Как это использовать:
Скопируйте и вставьте код в редактор сценариев. Нажмите «Сохранить», а затем скрипт будет активирован после внесения изменений в «Лист1» (не забудьте изменить имя в коде на имя вашего листа) и в столбцах B и далее. Вы не должны выполнять эту функцию вручную, это триггерная функция, и она выполняется сама по себе.