Как автоматически добавить данные на другой лист при изменении значений определенной ячейки? - PullRequest
2 голосов
/ 22 июня 2019

У меня есть лист с ценами на разные товары. Эти цены обновляются очень часто, и я хотел бы найти решение, при котором всякий раз, когда я изменяю дату в ячейке B2, дата и цены продуктов автоматически записываются в столбец на другой вкладке, которая называется Архив.

Вкладка ценообразования

enter image description here

Архивный файл

enter image description here

Я нашел несколько сценариев, которые автоматически записывают значения в другой лист на основе определенных значений, таких как «Готово» или «Завершено», но я не уверен, как адаптировать эти сценарии, когда целевое значение всегда изменяется (т. Е. Ячейка БИ 2).

Один из этих сценариев:

function onEdit() {
  var sheetNameToWatch = "Pricing";
  var columnNumberToWatch = 2;
  var valueToWatch = "[Unclear what the value should be]";
  var sheetNameToMoveTheRowTo = "Archive";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
  }
}

Полный лист можно найти здесь: https://docs.google.com/spreadsheets/d/13UAx8ANRkvLcLZ7Pxj4INigQatFpv8F2NF6AVuRSPb8/edit?usp=sharing

Идеальным выходом будет скрипт, который может автоматически записывать значения цены на основе ячейки B2. Если есть более простое решение для этого, это очень приветствуется! Заранее спасибо.

1 Ответ

1 голос
/ 23 июня 2019
  • Исходя из вашего вопроса, в вашей общей электронной таблице при изменении ячейки даты "B2" на листе Current Pricing вы хотите скопировать значения "B2: B" в последний столбец листа Archive.

Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

В этой модификации я использовал следующий поток, используя объект события простого триггера.

  1. Когда ячейка редактируется, запускается простой триггер onEdit().
  2. Когда запускается onEdit(), когда имя листа, отредактированная ячейка и значение равны sheetNameToWatch, dateCell и обновлены соответственно, значения "B2: B" на листе sheetNameToWatch равны скопировано в последний столбец листа archiveSheet.

Модифицированный скрипт:

Когда вы используете этот скрипт, пожалуйста, установите переменные в верхней части скрипта.

function onEdit(e) {
  var archiveSheet = "Archive"; // Please set this.
  var sheetNameToWatch = "Current Pricing"; // Please set this.
  var dateCell = "B2"; // Please set this.

  var range = e.range;
  var sheet = range.getSheet();
  var value = Number(e.value);
  if (
    sheet.getSheetName() == sheetNameToWatch &&
    range.getA1Notation() == dateCell &&
    Number(e.oldValue) != value
  ) {
    var srcRange = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1);
    var dstSheet = e.source.getSheetByName(archiveSheet);
    var dstRange = dstSheet.getRange(2, dstSheet.getLastColumn() + 1);
    srcRange.copyTo(dstRange);
  }
}

Примечание:

  • Этот скрипт использует простой триггер. Поэтому, когда вы используете этот сценарий в своей общей электронной таблице, измените ячейку "B2" на sheetNameToWatch ("Текущая цена"). При этом сценарий автоматически запускается триггером события OnEdit.
    • Если вы напрямую запускаете onEdit() с помощью редактора сценариев, ошибка возникает в var range = e.range;, потому что используется объект события. Пожалуйста, будьте осторожны с этим.

Ссылки

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

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