Временная метка, запускаемая при редактировании, не срабатывает достаточно быстро - PullRequest
0 голосов
/ 03 октября 2018

У меня есть Google Sheet, в котором работают 15 человек.Я использую приведенный ниже скрипт для добавления метки времени в столбец X всякий раз, когда данные вводятся в столбец Q:

var COLUMNTOCHECK = 17;
var DATETIMELOCATION = [0, 6];
var SHEETNAME = 'Requires Review'

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  if (sheet.getSheetName() == SHEETNAME) { 
    var selectedCell = ss.getActiveCell();
    if (selectedCell.getColumn() == COLUMNTOCHECK) { 
      var dateTimeCell = selectedCell.offset(DATETIMELOCATION[0], DATETIMELOCATION[1]);
      dateTimeCell.setValue(new Date(new Date().setHours(0, 0, 0, 0)))
                  .setNumberFormat('MM/d/yy');
    }
  }
}

Скрипт работает, но не всегда.Я предполагаю, что это потому, что есть случаи, когда несколько пользователей вносят изменения в столбец Q одновременно, и сценарий не может идти в ногу.Есть ли способ это исправить?Есть ли способ создать другой сценарий, который выполняет те же действия, что и выше, но вместо триггера редактирования он выполняется каждую минуту или около того и добавляет массовую метку времени ко всем ячейкам в столбце Q, которые заполнены?

1 Ответ

0 голосов
/ 03 октября 2018

попробуйте этот код, он будет работать немного быстрее, так как вы будете использовать объект события e, в котором уже содержится активный диапазон:

var COLUMNTOCHECK = 17;
var DATETIMELOCATION = [0, 6];
var SHEETNAME = 'Requires Review'

function onEdit(e) {
  if (e.range.getSheet().getName() == SHEETNAME) { 
    if (e.range.getColumn() == COLUMNTOCHECK) { 
      var dateTimeCell = e.range.offset(DATETIMELOCATION[0], DATETIMELOCATION[1]);
      dateTimeCell.setValue(new Date(new Date().setHours(0, 0, 0, 0)))
                  .setNumberFormat('MM/d/yy');
    }
  }
}

или использовать временный триггер для активации вашей функциикаждые х минут / часов.В этом примере вам просто нужно выполнить createTrigger один раз.

var COLUMNTOCHECK = 17;
var DATETIMELOCATION = [0, 6];
var SHEETNAME = 'Requires Review'

function createTrigger()
{
  ScriptApp.newTrigger("myFunction")
    .timeBased()
    //triggers every 2 hours
      .everyHours(2)
        .create();
}

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(SHEETNAME);
  //then grab the correct range and set Values
    }
  }
}
...