Google Sheets - Скрипт для перемещения строк на разные вкладки в зависимости от ключевого слова - PullRequest
0 голосов
/ 08 мая 2019

Я работаю над листом Google, который получает форму. После отправки мне нужен сценарий для перемещения строк данных на разные вкладки в зависимости от имени, указанного в столбце C.

Я интенсивно искал решения по переполнению стека, и сейчас я очень близок к решению по коду, который я нашел и отредактировал.

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

Все, что мне нужно сделать сейчас, это изменить это, чтобы переместить строки с именем «Джон» в столбце C на вкладку «Джон» и игнорировать дату.

Как только я смогу заставить работать одно имя, я уверен, что смогу сделать это для нескольких имен и нескольких вкладок.

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

ссылка: https://docs.google.com/spreadsheets/d/1zJpylrD_5hzScW3lIjIQQSKiY0Aan6Wkm_h_IbVrVXM/edit#gid=0

function MovePastDates() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var entrySheet = ss.getSheetByName("Entry Sheet");
  var franksSheet = ss.getSheetByName("Franks Sheet");  
  var lastColumn = entrySheet.getLastColumn();

  for(var i = entrySheet.getLastRow(); i > 0; i--){

      var dateCell = entrySheet.getRange(i, 1).getValue();
      var today = new Date();
      var test = new Date(dateCell);


      // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
      if(test < today){

        var rangeToMove = entrySheet.getRange(i, 1, 1, entrySheet.getLastColumn()).getValues();
        franksSheet.getRange(franksSheet.getLastRow() + 1, 1, 1, entrySheet.getLastColumn()).setValues(rangeToMove);
        entrySheet.deleteRow(i);

      }
   }       
}

Окончательный результат должен быть листом Google, который получает записи формы.

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

Все остальные пользователи листа будут иметь доступ только для просмотра.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Я хотел два скрипта:

1) Скрипт для перемещения строк отправки формы на определенную вкладку в зависимости от имени человека (я собирался настроить триггер каждую минуту для этого)

2) Скрипт для перемещения прошлых дат в исторический лист (я собирался настраивать триггер каждую ночь для этого)

Мне удалось изменить ваш код для достижения желаемой функции, возможно, это ненаиболее эффективный, но, кажется, работает хорошо.

Первый сценарий:

   function moveRowsToNamesSheets() { //Name of function
  var sObj={John:'Johns Sheet',Frank:'Franks Sheet',David:'Davids Sheet'};   // Put key work and sheet name here in format eg.( keyWord1: 'sheet name to move keyWord1 to') 
  var ss=SpreadsheetApp.getActive();                                         // ??
  var esh=ss.getSheetByName('Entry Sheet');                                  //Sheet data is being pulled form
  var fsh=ss.getSheetByName('Franks Sheet');                                 //unsure why one of the sheets is named here
  var erg=esh.getDataRange();                                                // Not sure of function now that I am not using dates
  var evA=erg.getValues();                                                   // ??
  var d=0;                                                                   //??
  //var today=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()).valueOf();  // Didnt need this line
  for(var i=1;i<evA.length;i++) {                                            //??
    if(/*new Date(evA[i][0]).valueOf() < today*/ evA[i][2]=='John' ||evA[i][2]=='Frank' ||evA[i][2]=='David') { //Keywords used go here, what does the [2] mean?
      ss.getSheetByName(sObj[evA[i][2]]).appendRow(evA[i]);                  //??
      esh.deleteRow(i+1-d);
      d++;                                                                   //increments d by one
    }
  }
}

Второй сценарий:

function HistoricDates() {

  // Initialising
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  //--------------- Franks Sheets --------------------
  var franksSheet = ss.getSheetByName("Franks Sheet");
  var PastSheet = ss.getSheetByName("Historic Requests");  
  var lastColumn = franksSheet.getLastColumn();

  // Check all values from your "Franks Sheet" sheet
  for(var i = franksSheet.getLastRow(); i > 0; i--){

    // Check if the value is a valid date
    var dateCell = franksSheet.getRange(i, 4).getValue();  //Dates in column 4
    if(isValidDate(dateCell)){
      var today = new Date();
      var test = new Date(dateCell);

      // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
      if(test < today){

        var rangeToMove = franksSheet.getRange(i, 1, 1, franksSheet.getLastColumn()).getValues();
        PastSheet.getRange(PastSheet.getLastRow() + 1, 1, 1, franksSheet.getLastColumn()).setValues(rangeToMove);
        franksSheet.deleteRow(i);

      }
    }
  }

  //---------------------- Johns Sheets -------------------------
  var johnsSheet = ss.getSheetByName("Johns Sheet");
  var pastSheet = ss.getSheetByName("Historic Requests");  
  var lastColumn = johnsSheet.getLastColumn();

  // Check all values from your "Johns Sheet" sheet
  for(var i = johnsSheet.getLastRow(); i > 0; i--){

    // Check if the value is a valid date
    var dateCell = johnsSheet.getRange(i, 4).getValue(); //Dates in column 4
    if(isValidDate(dateCell)){
      var today = new Date();
      var test = new Date(dateCell);

      // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
      if(test < today){

        var rangeToMove = johnsSheet.getRange(i, 1, 1, johnsSheet.getLastColumn()).getValues();
        pastSheet.getRange(pastSheet.getLastRow() + 1, 1, 1, johnsSheet.getLastColumn()).setValues(rangeToMove);
        johnsSheet.deleteRow(i);

      }
    }
  }  

    //--------------- Davids Sheets --------------------
  var davidsSheet = ss.getSheetByName("Davids Sheet");
  var pastSheet = ss.getSheetByName("Historic Requests");  
  var lastColumn = davidsSheet.getLastColumn();

  // Check all values from your "Davids Sheet" sheet
  for(var i = davidsSheet.getLastRow(); i > 0; i--){

    // Check if the value is a valid date
    var dateCell = davidsSheet.getRange(i, 4).getValue();//Dates in column 4
    if(isValidDate(dateCell)){
      var today = new Date();
      var test = new Date(dateCell);

      // If the value is a valid date and is a past date, we remove it from the sheet to paste on the other sheet
      if(test < today){

        var rangeToMove = davidsSheet.getRange(i, 1, 1, davidsSheet.getLastColumn()).getValues();
        pastSheet.getRange(pastSheet.getLastRow() + 1, 1, 1, davidsSheet.getLastColumn()).setValues(rangeToMove);
        davidsSheet.deleteRow(i);

      }
    }
  }

}

// Check is a valid date
function isValidDate(value) {
  var dateWrapper = new Date(value);
  return !isNaN(dateWrapper.getDate());
}

Рабочая электронная таблица расположена здесь: https://docs.google.com/spreadsheets/d/1VCONRkBpkva-KrFDO2bFV8ZTp1U168QWAGavcKCa_uQ/edit?usp=sharing

0 голосов
/ 08 мая 2019

Я думаю, это то, что вы хотите:

function movePastDatesOrJohn() {
  var sObj={John:'Johns Sheet',Frank:'Franks Sheet',David:'Davids Sheet'};
  var ss=SpreadsheetApp.getActive();
  var esh=ss.getSheetByName('Entry Sheet');
  var fsh=ss.getSheetByName('Franks Sheet');
  var erg=esh.getDataRange();
  var evA=erg.getValues();
  var d=0;
  var today=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()).valueOf();
  for(var i=1;i<evA.length;i++) {
    if(new Date(evA[i][0]).valueOf() < today || evA[i][2]=='John') {
      ss.getSheetByName(sObj[evA[i][2]]).appendRow(evA[i]);
      esh.deleteRow(i+1-d);
      d++;
    }
  }
}

Так что Фрэнкс Шит и Дэвидс Шит получают только те строки, которые старше, чем сегодня.Но Johns Sheet получает все подряд, которые являются Johns, и игнорирует дату.Я думаю, это то, что вы хотели.Но дайте мне знать, если я неправильно понял ваш вопрос, оставив еще один комментарий.Рад помочь.

Кстати, знаете ли вы, что если к вашей электронной таблице прикреплено более одной формы, вы можете указать, в какой лист ответов триггер formSubmit тоже пишет с диапазоном объекта события.Использование sheet name = e.range.getSheet().getName();

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