Как использовать значение ячейки для установки целевого листа в качестве переменной

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

/* This script will send the the student data from source sheet to target sheet when checkbox is true in ColA
*/


function onEdit(event) {
  const ui = SpreadsheetApp.getUi();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var eventSheet = event.source.getSheetByName("sheet1");
  const sourceSheet = ss.getSheetByName("sheet1");
  const targetSheet = ss.getSheetByName("sheet2");
  var eventRange = event.source.getActiveRange();
  //let destName = eventSheet.getRange(i,eventRange.getLastColumn()).getValue();


if(eventSheet.getName() == sourceSheet.getName()) {

  if (eventSheet.getName() == sourceSheet.getName() && eventRange.getColumn() == 1 && eventRange.getValue() == true) { //if a change happens on the source sheet & that change is in column 1 & the column 1 value becomes true

    var rowNum = eventRange.getRow(); //get the row number of the checked row
    var numColumns = eventSheet.getLastColumn(); //get the number of columns in the source sheet
    const row = eventSheet.getRange(rowNum, 2, 1, numColumns).getValues(); //get all the data in the row of the checked row

    var result = ui.alert( //warn the user they are about to save a record
      'Are you sure you this student is ready to export? This will delete this row',
      ui.ButtonSet.YES_NO);

    if (result == ui.Button.YES) { //if the user clicks yes */
      targetSheet.appendRow(row[0]); //add the row to the target sheet
      sourceSheet.deleteRow(rowNum); //delete the row from the source sheet
    } else { //if the user clicks no
      const checkBox = sourceSheet.getRange(rowNum, 1); //get the selected checkbox
      checkBox.setValue(''); //clear the checkbox
    } 
  }


}
}

Я бы хотел, чтобы targetSheet был переменной, полученной из второго столбца данных, который соответствует имени листа. Итак, если в строке данных есть «bob» в столбце b, данные будут скопированы в bob, если это «john», они будут скопированы в john и т. Д. Прямо сейчас он работает для отправки данных с листа1 на лист2, отлично работает , но будет удобнее скопировать на лист на основе имени листа. Как я могу сделать targetSheet переменной? Пример листа: https://docs.google.com/spreadsheets/d/17Jo-emwVG199x19uiJUsX3q0xK9x-JIfUW45wGrTTIM/edit?usp=sharing


person Tim Welch    schedule 13.06.2021    source источник


Ответы (1)


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

  • Когда установлен флажок в столбце A листа Sheet1, вы хотите получить значения столбцов от B до E, а значения столбцов от C до E, добавленные к листу с именем листа, получить из столбца B.

Пункты модификации:

  • В вашем скрипте, я думаю, можно использовать объект события.
  • eventSheet.getName() == sourceSheet.getName() используется 2 раза. В этом случае это можно использовать 1 раз.
  • Чтобы подтвердить значение флажка, вы можете использовать isChecked().
  • Чтобы снять флажок, вы можете использовать uncheck().

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

Измененный скрипт:

function onEdit(event) {
  const sourceSheet = "sheet1";
  const eventRange = event.range;
  const eventSheet = eventRange.getSheet();
  if (eventSheet.getSheetName() == sourceSheet && eventRange.columnStart == 1 && eventRange.isChecked()) {
    const ui = SpreadsheetApp.getUi();
    const result = ui.alert('Are you sure you this student is ready to export? This will delete this row', ui.ButtonSet.YES_NO);
    if (result == ui.Button.YES) {
      const [name, ...value] = eventRange.offset(0, 1, 1, 4).getValues()[0];
      const targetSheet = event.source.getSheetByName(name);
      if (targetSheet) {
        targetSheet.appendRow(value);
        eventSheet.deleteRow(eventRange.rowStart);
      } else {
        throw new Error("No sheet.");
      }
    } else {
      eventRange.uncheck();
    }
  }
}
  • При использовании этого сценария установите флажок в столбце A листа Sheet1. Таким образом, значения перемещаются на конкретный лист, полученный из столбца B. Если вы напрямую запускаете функцию onEdit с редактором сценария, возникает ошибка. Пожалуйста, будьте осторожны.

Примечание:

  • В этом модифицированном сценарии я протестировал его, используя вашу таблицу-образец. Поэтому, когда структура вашего образца электронной таблицы отличается от вашей реальной ситуации, сценарий может оказаться невозможным. Так что будьте осторожны.

Использованная литература:

person Tanaike    schedule 13.06.2021
comment
Спасибо, это отлично работает. Я ценю вашу помощь в этом. Можно ли было бы расширить это, создав скрипт новой вкладки с именем вкладки, если она еще не существует? Итак, если вкладка не существует, создайте вкладку, затем скопируйте данные и удалите из источника. - person Tim Welch; 14.06.2021
comment
@ Тим Уэлч Спасибо за ответ. Я рад, что ваша проблема решена. Что касается вашего нового вопроса о Would it be possible to extend this by having the script create a new tab with the tab name if it did not already exist? So, if tab does not exist, create tab, then copy data and delete from source., я думаю, что в этом случае я хотел бы предложить изменить throw new Error("No sheet."); в своем ответе для вашей ситуации. Если это не помогло, прошу прощения. - person Tanaike; 14.06.2021