Копирование и вставка нескольких строк в следующую пустую строку на другом листе - PullRequest
0 голосов
/ 30 мая 2020

У меня есть следующий сценарий:

function onEdit(event) {
  // assumes source data in sheet named Needed
  // target sheet of move to named Acquired
  // test column with yes/no is col 5 or E
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if(s.getName() == "IN" && r.getColumn() == 7 && r.getValue() == "Y") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("ORDERS");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target);

  }
}

Это исходное сообщение, в котором я нашел сценарий: https://support.google.com/docs/forum/AAAABuH1jm0hR40qh02UWE/?hl=en&gpf=%23! Topic% 2Fdocs% 2FhR40qh02UWE

Я хочу внести несколько небольших изменений в код, но не знаю, с чего начать.

В настоящее время он копирует всю строку, когда "Y" вводится в столбец G, и помещает содержимое строки в последняя строка ЗАКАЗОВ!.

Я хочу, чтобы он делал:

1) копировать только столбцы B, C и E в последнюю строку ЗАКАЗОВ! 2) удалить значения в E и F на IN! после того, как код был запущен для этой строки c (не хочу, чтобы он удалял строки, против которых я не поставил "Y") 3) Есть ли способ вместо этого иметь кнопку, которая при нажатии кнопки копирует сразу все строки с буквой «Y»?

Вот ссылка на мою таблицу, если вы хотите поиграть: https://docs.google.com/spreadsheets/d/1Peo5_5QmkxVyL7j5bmgtMs9BL16cvsGhhOSuRV_TsAo/edit?usp=sharing

С уважением, человек c

1 Ответ

1 голос
/ 30 мая 2020

Я считаю, что ваша цель следующая.

  • Когда столбец «G» равен Y, вы хотите скопировать значения столбцов «B», «C» и » Е »до последней строки листа ORDERS.
    • Вы хотите скопировать все строки, в которых столбец «G» равен Y при запуске скрипта.
  • Вы хотите удалить содержимое столбца «E "и" F "скопированных строк в листе IN при запуске сценария.
  • Вы хотите запустить сценарий, нажав кнопку на листе.

Для этого, как насчет этого ответа?

Точки модификации:

  • В вашем скрипте
    • Когда скрипт запускается нажатием кнопки на листе , объект события не может быть использован.
    • Ваш скрипт копирует одну строку активного диапазона.
    • Столбцы «E» и «F» скопированных строк не удаляются.

Требуется изменить указанные выше пункты модификации. Когда указанные выше пункты отражаются в сценарии, он становится следующим:

Измененный сценарий:

Скопируйте и вставьте следующий сценарий в редактор сценариев. И, пожалуйста, подготовьте кнопку, которая является рисунком и / или изображением, и назначьте кнопке функцию run. Таким образом, когда кнопка нажата, сценарий запускается. И столбцы «B», «C» и «E» всех строк, которые столбец «G» составляет Y, копируются из листа «IN» в последнюю строку листа «ORDERS».

function run() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = ss.getSheetByName("IN");
  var dstSheet = ss.getSheetByName("ORDERS");

  // 1. Retrieve the values from "A2:G" of sheet "IN".
  var srcValues = srcSheet.getRange("A2:G" + srcSheet.getLastRow()).getValues();

  // 2. Create an object for putting values and deleting the contents of the columns "E" and "F".
  var obj = srcValues.reduce((o, [,b,c,,e,,g], i) => {
    if (g == "Y") {
      o.values.push([b, c, e]);
      o.ranges.push(`E${i + 2}:F${i + 2}`);
    }
    return o;
  }, {values: [], ranges: []});

  // 3. Copy the values to the sheet "ORDERS".
  dstSheet.getRange(dstSheet.getLastRow() + 1, 1, obj.values.length, obj.values[0].length).setValues(obj.values);

  // 4. Delete the contents of the columns "E" and "F" of sheet "IN".
  srcSheet.getRangeList(obj.ranges).clearContent();
}

Примечание:

  • Насчет кнопки запуска скрипта Google Apps, думаю, этот сайт полезен. Ref В вашем случае создайте кнопку на листе «IN» и назначьте кнопке функцию run. Таким образом, при нажатии кнопки сценарий работает.
  • Пожалуйста, используйте этот сценарий с V8.

Ссылки:

...