Как вырезать и вставить строку на другой лист, используя Java Apps Script в Google Sheets? - PullRequest
0 голосов
/ 06 ноября 2019

Я прикрепил следующую ссылку к моей таблице Google.

Электронная таблица

На листе под названием «Квалификации» приведен список сотрудников и персональные данные. Когда сотрудник уходит, пользователь нажимает кнопку «Сотрудник влево», которая открывает столбец B. Предполагается, что пользователь затем добавит рядом с именем сотрудника дату ухода сотрудника и после нажатия пользователем ввести соответствующую строку. будет вырезан и вставлен в лист с заголовком «Квалификация - оставленные сотрудники», а столбец B снова будет скрыт. Это мой способ попытаться заархивировать данные и по-прежнему иметь доступ к ним на случай, если сотрудник вернется.

Я запустил скрипт приложения в строке 194 редактора скриптов. Первоначально я собирался просто скрыть строку, но я не хочу, чтобы все маленькие стрелки были скрыты в Google Sheets. Сейчас я борюсь с кодом и буду признателен за помощь.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Если я вас правильно понимаю, вы хотите:

(1) Показать столбец B при нажатии кнопки Employee LeftQualifications).

(2) Еслипользователь записывает дату в столбце Date LeftQualifications), все данные в соответствующей строке обрезаются и вставляются в первую пустую строку в Qualifications - Employees Left, а столбец B снова скрывается.

Я изменил ваш скрипт так, чтобы он выполнял эти задачи.

Во-первых, похоже, что функция EmployeeLeft, которую вы написали, уже делает то, что должна, но я немного переработал ее. Я не уверен, почему вы хотите активировать, а затем показать столбец C, но в любом случае, все, что вам подходит. Это тот, который я написал:

function EmployeeLeft() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var colIndex = 2;
  sheet.showColumns(colIndex);
  sheet.getRange("B5").activate();
}

Затем идет основная часть. Чтобы выполнить пункт (2), я написал функцию внутри триггера onEdit. Я знаю, что у вас уже есть функция onEdit, но я думаю, что не должно быть никаких проблем при интеграции этого кода в нее.

По сути, эта функция проверяет, является ли отредактированная ячейка из листа Qualifications, из column B, а не из строки заголовка, и что отредактированное значение является действительным Дата . Если все эти условия выполнены, отредактированная строка удаляется из Qualifications, а ее значения копируются в первую пустую строку в Qualifications - Employees Left. Наконец, column B снова становится скрытым, пока Employee Left не будет нажата снова.

Вот функция:

function onEdit(e) {
  var ss = e.source;
  var sheet = ss.getActiveSheet();
  var sheetName = "Qualifications"
  var range = e.range;
  var editedColumn = range.getColumn();
  var editedRow = range.getRow();
  var column = 2;
  var date = range.getValue();
  // Object.prototype.toString.call(date) === '[object Date]' --> checks if value is date
  // editedColumn == column && editedRow > 4 --> checks if edited cell is from 'Date Left'
  // sheet.getName() == sheetName --> checks if edited sheet is 'Qualifications'
  if(Object.prototype.toString.call(date) === '[object Date]' && editedColumn == column && editedRow > 4 && sheet.getName() == sheetName) {
    var numCols = sheet.getLastColumn();
    var row = sheet.getRange(editedRow, 1, 1, numCols).getValues();
    var destinationSheet = ss.getSheetByName("Qualifications - Employees Left");
    // Get first empty row:
    var emptyRow = destinationSheet.getLastRow() + 1;
    // Copy values from 'Qualifications'
    destinationSheet.getRange(emptyRow, 1, 1, numCols).setValues(row);
    sheet.deleteRow(editedRow);
    sheet.hideColumns(column);
  }
}

Примите во внимание, что в некоторых строках есть некоторые данные, расположенные намного ниже заголовков в разделе «Квалификации - оставленные сотрудники». Убедитесь, что вы удалили все эти данные, чтобы значения копировались в соответствующие строки.

Обновление

Здесь я делюсь копией электронной таблицы с правильным приложенным сценарием. Я бы посоветовал вам скопировать полный скрипт и вставить его в файл, над которым вы работаете, удалив все предыдущее содержимое:

https://docs.google.com/spreadsheets/d/1XCrcSaDwwmKTHLIxL9vbx0_t6NJew983d9YDol-Y1dw/edit?usp=sharing

  • Функция onEdit(e)добавлен сверху, включая и тот, который я написал, и тот, который вы уже написали.
  • Что касается функции Employee Left, я прокомментировал тот, который вы написали, и добавил свой ниже. Если вы предпочитаете свою, просто удалите мою и раскомментируйте свою.

Я надеюсь, что это поможет, и, пожалуйста, скажите мне, если это работает для вас.

0 голосов
/ 06 ноября 2019

Этот код удалит завершенную строку с активной ячейкой и добавит ее на новый лист в конце. Не забудьте заменить значения, содержащие <>, на фактические.

function remove_and_reinsert_row() {
   var sheet = SpreadsheetApp.getActiveSheet();
   var active_range = sheet.getActiveRange();
   var last_column = sheet.getLastColumn();
   var tbd_row_data = sheet.getRange(active_range.getRowIndex(), 1, 1,last_column).getValues();
   sheet.deleteRow(active_range.getRowIndex());

   var new_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("existing sheet name");
   var last_active_row = new_sheet.getLastRow();
   new_sheet.getRange(last_active_row+1, 1, 1,tbd_row_data[0].length).setValues(tbd_row_data);
}

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

Чтобы скрыть столбец, вы можете использовать следующую функцию:

  sheet.hideCoumns(colIndex);

Надеюсь, это поможет,

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