Расписание автоархива;Основанный на времени триггер - PullRequest
0 голосов
/ 11 июля 2019

Меня попросили создать живую электронную таблицу Google Sheets, чтобы отслеживать график работы на нашем дворе.У меня нет опыта работы со сценарием, но я узнал, что я могу программировать свой лист вместо того, чтобы скрывать формулы, и это даст более чистый результат.Мне удалось организовать лист самостоятельно, и я смог сделать его архивным вручную (onEdit).То, что я ищу, - это чтобы он автоматически запускал код в 1 час ночи, поэтому, когда мы приступаем к работе, он архивирует на основе значения ячейки в определенном столбце.

Это пример моего скрипта onEdit, который работает, но когда кто-то пытается пометить столбец «ДА», возникает некоторая задержка, которая может привести к проверке неправильной ячейки, которую я затем вручную исправляю.

function onEdit() {
  var sheetNameToWatch = "Schedule";

  var columnNumberToWatch = 28;
  var valueToWatch = "Yes";
  var sheetNameToMoveTheRowTo = "Archive";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {

    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
  }
}

Таким образом, этот код выполняется с ошибкой 100%, но сохраняет и выполняет, и я, честно говоря, не знаю почему.Может быть, я неправильно понимаю значения, которые мне нужно вставить после области «функция».У меня была эта настройка с триггером «Автоархивация», который создал кнопку меню с опцией «Выполнить» на листе, но когда вы щелкаете по ней, она выполняет только последнюю строку с «Да» в столбце 28 (каждое нажатие кнопкикнопка будет перемещаться на 1 строку, пока все строки не будут перемещены), и кнопка не будет работать для других пользователей листа.

function createTrigger() {
  ScriptApp.newTrigger("Move Archive") //Move Archive is the name of the script
    .timeBased()
    .everyMinutes(1) // only set to 1 minute for testing, I can change this out for a daily timer
    .create();
}


function myFunction() {
  var sheetNameToWatch = "Schedule"; // "schedule" is the sheet we enter info on

  var columnNumberToWatch = 28; //Column is "AB"
  var valueToWatch = "Yes";
  var sheetNameToMoveTheRowTo = "Archive"; //"Archive is the sheet the info is sent to"

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {

    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange); // I get its programmed for last row with "Yes" here, unsure on how to change this.
    sheet.deleteRow(range.getRow());

    function myfunction() {
      ScriptApp.deleteTrigger("Move Archive"); // could have wrong value here

    }
  }
}

Все, что мне нужно, это лист "Архивировать" на основе значения "Да" в столбце 28 (AB).Я хочу, чтобы каждая строка со значением этого столбца автоматически архивировалась в 1 час ночи.Любая помощь приветствуется.Если кто-то даже захочет порекомендовать книгу или цифровую инструкцию для начинающих, это было бы здорово.

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Вы можете установить устанавливаемый триггер для запуска этой функции в 1:00 каждое утро:

function scheduleToArchive() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var schedule = sheet.getSheetByName("Schedule");
  var archive = sheet.getSheetByName("Archive");
  var scheduleData = schedule.getRange(2, 1, (sheet.getRange('A:A').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()), 28);

  for (row = 2; row <= scheduleData.getNumRows(); row++){
    var data = schedule.getRange(row, 1, 1, 28).getValues();

    if (data[0][27] == 'Yes'){
     archive.getRange((archive.getLastRow() + 1), 1, 1, 28).setValues(data);
    }    
    schedule.getRange(row, 1, 1, 28).clear();
  }  
}

В вашей электронной таблице, когда getDataRange() запускается на листе с именем «Расписание», он возвращает строку 631 как последнюю строку с данными, даже если в первых 20 строках есть только данные, так что для обхода этого я вместо этого мы использовали SpreadsheetApp.Direction.DOWN и запустили это в столбце A.

0 голосов
/ 12 июля 2019

У вас есть четыре файла проекта, каждый из которых содержит сценарии с одинаковым именем, выполняющие одинаковые или похожие задачи Вы испытываете запаздывание, потому что у вас есть несколько простых и устанавливаемых сценариев с тем же именем. По сути, все они пытаются выполнить одновременно.

Следующий ответ следует рассматривать как одно из возможных решений вашей ситуации.

Элементы этого скрипта:

  • Существует один файл проекта. Ненужные файлы проекта были удалены.
  • Есть одна функция.
  • Функция представляет собой один «простой» триггер (onEdit (e)), который использует преимущества различных объектов событий, возвращаемых onEdit. Устанавливаемых триггеров нет, и все / все устанавливаемые триггеры были удалены.
  • Функция обновляет листы «Расписание» и «Архив», как описано в вопросе; а затем сортирует листы «Расписание» и «Архив».
  • Если на листе «Вагоны» есть изменения, функция сортирует этот лист.

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var testrange = e.range;
  var testsheet = testrange.getSheet();
  var testsheetname = testsheet.getSheetName();
  var testrow = testrange.getRow();
  var testcolumn = testrange.getColumn();
  var testvalue = e.value;
  var testsheetLC = testsheet.getLastColumn();
  var testsheetRange = testsheet.getRange(testrow,1,1,testsheetLC);
  //Logger.log("DEBUG: the test sheet range is "+testsheetRange.getA1Notation()); 
  //Logger.log("DEBUG: Range: "+testrange.getA1Notation());
  //Logger.log("DEBUG: The row is "+testrow+", and the column is "+testcolumn);
  //Logger.log("DEBUG: The spreadheetsheet is "+e.source.getName()+", the sheet name is  "+testsheet+", the range = "+testrange.getA1Notation()+", and the new value = "+testvalue);
  //Logger.log(JSON.stringify(e));

  // Copy/Paste to Schedule/Archive
  var sheetNameSchedule = "Schedule";
  var colNumberSchedule = 28;
  var valueSchedule = "Yes";
  var sheetNameArchive = "Archive";

  // Sort Schedule
  var sortSchedule = [{column: 1, ascending: true},{column: 2, ascending: true},{column: 7, ascending: false}];// date // Appt (time) // Type (Out/In/RR)
  // Sort Railcars
  var sheetNameRailcars = "Railcars";
  var sortRailcars = [{column: 1, ascending: true}];

  if (testsheetname === sheetNameSchedule && testcolumn === colNumberSchedule && testvalue === valueSchedule){
    // this is a match
    // Logger.log("DEBUG: this was a match");

    // copy/paste to archive
    var targetSheet = ss.getSheetByName(sheetNameArchive);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    //Logger.log("DEBUG: the target range is "+targetRange.getA1Notation());
    testsheetRange.moveTo(targetRange);
    testsheet.deleteRow(testrow);

    // sort the Schedule Sheet
    var Avals = testsheet.getRange("A1:A").getValues();
    var Alast = Avals.filter(String).length;
    //Logger.log("DEBUG: The last row of content (in column A) = "+Alast+", and the last column = "+testsheetLC);
    var sortrange = testsheet.getRange(2,1,Alast-1,testsheetLC);
    //Logger.log("DEBUG: the sort range = "+sortrange.getA1Notation());
    sortrange.sort(sortSchedule);

    // sort the Archive Sheet
    var ATvals = targetSheet.getRange("A1:A").getValues();
    var ATlast = ATvals.filter(String).length;
    //Logger.log("DEBUG: The last row of content (in column A) = "+ATlast+", and the last column = "+testsheetLC);
    var sortrange = targetSheet.getRange(2,1,ATlast-1,testsheetLC);
    //Logger.log("DEBUG: the sort range = "+sortrange.getA1Notation());
    sortrange.sort(sortSchedule);
  }
  else if (testsheetname === sheetNameRailcars){

    // sort the sheet
    var Avals = testsheet.getRange("A1:A").getValues();
    var Alast = Avals.filter(String).length;
    //Logger.log("DEBUG: The last row of content (in column A) = "+Alast+", and the last column = "+testsheetLC);
    var sortrange = testsheet.getRange(2,1,Alast-1,testsheetLC);
    //Logger.log("DEBUG: the sort range = "+sortrange.getA1Notation());
    sortrange.sort(sortRailcars);
  } 

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