@pteslenko7

Как сделать проверку по определенному столбцу?

У меня есть таблица гугл. В ней 2 листа. В первом листе данные регулярно меняются. Есть список участков (это неизменяемые данные), дальше к участку может быть прикреплен человек, и есть дата начала и дата завершения работ (это изменяемые данные). Участок может прорабатываться разными людьми в разные даты. Поэтому есть необходимость вести своего рода журнал учета, когда и кем брался определенный участок. Второй лист должен служить как журнал записи.

Нужно сделать так, чтобы когда по определенному участку добавлялся человек + добавлялась дата начала и завершения работ, тогда эти данные (вместе с номером участка) переносились на второй лист. И вставлялись в последнюю пустую ячейку. И так до бесконечности. Просто журнал записей.

Этим скриптом я получил доступ к листу 1 и 2, получил данные из активных ячеек листа 1. И перенес их на лист 2.

function addToDatabase(){
  var list1 = SpreadsheetApp.getActiveSpreadsheet(); //лист откуда берем данные
  var activCell = list1.getActiveSheet().getActiveCell(); //определение ячейки на которой сейчас находится курсор   

  var activNum = activCell.getRow(); //номер активной ячейки
  
  var number = list1.getActiveSheet().getRange(activNum, 1).getValue(); // номер участка
  var name = list1.getActiveSheet().getRange(activNum, 2).getValue(); // имя человека
  var date1 = list1.getActiveSheet().getRange(activNum, 4).getValue(); // дата начала работ
  var date2 = list1.getActiveSheet().getRange(activNum, 6).getValue(); // дата завершения работ
  
  var activColumn = list1.getActiveSheet().getActiveCell().getColumn(); //номер активного столбца
  
  var list2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Журнал вода данных"); //лист куда вставляем данные
  
  var lastEmptyRow = list2.getLastRow() + 1; //разбивка куда какие данные вставлять 
  list2.getRange(lastEmptyRow, 1).setValue(number); // вставить номер
  list2.getRange(lastEmptyRow, 2).setValue(name); // вставить имя
  var lastEmptyRow = list2.getLastRow() + 1; //разбивка куда какие данные вставлять
  list2.getRange(lastEmptyRow, 1).setValue(number); // вставить номер
  list2.getRange(lastEmptyRow, 2).setValue(date1); // вставить дату начала работ
  list2.getRange(lastEmptyRow, 3).setValue(date2); // вставить дату завершения работ
      
}


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

То есть если в строке 2 заполнен и номер, и имя, и дата начала, и дата завершения, тогда скрипт переносит данные из этой строки на лист 2.

Точно также и для остальных участков. Если в строке 3 заполнен и номер, и имя, и дата начала, и дата завершения, тогда скрипт переносит данные из этой строки на лист 2 и т.д

Если какая-то из ячеек (номер, имя, дата начала, дата завершения) не заполнена, тогда данные из этой строки не переносятся.

Мне посоветовали сделать проверку на не пустую ячейку.

Подскажите, пожалуйста, как написать такую проверку?
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Если без объяснений кода, то

function onEdit() {
   run2();
}

function run2() {
  /* Remove dash */
  var sheet = SpreadsheetApp.getActiveSheet();
  if (sheet.getName() === 'Журнал вода данных') return;
  var archive = SpreadsheetApp.getActive().getSheetByName('Журнал вода данных');

  var action = function(values, i, i2) {
    var data = values.slice(i, i + i2);
    archive
      .getRange(archive.getLastRow() + 1, 1, data.length, data[0].length)
      .setValues(data);
  };

  var condition = function(values, i) {
    var row = values[i];
    return (
      i > 0 && row[0] !== '' && row[1] !== '' && row[3] !== '' && row[5] !== ''
    );
  };

  deleteRowsByConditional_(sheet, condition, action);
}

function deleteRowsByConditional_(sheet, condition, action) {
  sheet
    .getDataRange()
    .getValues()
    .forEach(
      function(_, i, arr) {
        var j = arr.length - i - 1;
        if (this.condition.apply(null, [arr, j])) {
          this.isContinue++;
          if (j > 0) return;
        }
        if (this.isContinue > 0) {
          var prevPos = j + 1; // It's reversed
          if (action) action(arr, prevPos, this.isContinue);
          this.sheet.deleteRows(prevPos + 1, this.isContinue);
          this.isContinue = 0;
          return;
        }
        return;
      },
      { sheet: sheet, condition: condition, isContinue: 0 }
    );
}


Будет работать на любом листе вашей Таблицы. Можно подключить run2() к меню.

Ссылка на видео https://www.facebook.com/oshliaer/videos/258791787...

Ссылка на сниппет https://github.com/contributorpw/google-apps-scrip...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы