Данные другой ячейки в текущую ячейку с дополнительными данными

#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 и далее. Вы не должны выполнять эту функцию вручную, это триггерная функция, и она выполняется сама по себе.

Иллюстрация:

пример