Невозможно установить объект даты javascript для ячейки, скрытой фильтром - PullRequest
0 голосов
/ 18 ноября 2018

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

Я напишу краткую версию всего сценария:

function test(){
    var nowTime = new Date();  
    var sheet = SpreadsheetApp.getActiveSpreadsheet();
    var lastrow =sheet.getLastRow();
    var lastcol =sheet.getLastColumn();
    var fullData =cell.offset(0, 0,lastrow- 
    cell.getRow()+1,lastcol).getValues();
    var cell = sheet.getRange("A2");
    var i=0;
    while (i<fullData.length){
        var reminderType =0;
        var row = fullData[i];
        if (row[0] == 1) {sendreminder();cell.offset(i, 2).setValue(new Date());}
    }
}

если, например, в первом столбце скрыты все строки с 1, скрипт выполняет и отправляет все напоминания, но игнорирует setvalue (), если строки видны, он работает отлично.

Одним из решений может быть удаление фильтра, но это очень раздражает, так как мы часто используем этот фильтр, и скрипт запускается по времени каждые 10 минут, поэтому я работаю над листом, и внезапно фильтр удаляют, чтобы запустить сценарий.

Я пробовал с cell.offset, getrange и т.д ... безуспешно ... Идеи?

РЕДАКТИРОВАТЬ: Проблема, кажется, только если я пытаюсь написать дату if (row[0] == 1) {cell.offset(i, 1).setValue(new Date());}
Например, я записываю другую информацию (число) в другой столбец, и эта ячейка обновляется.

Остальные остаются прежними вот тестовый лист, который я создал: https://docs.google.com/spreadsheets/d/1-FNDGmvCc8nRFTG65Sj9L2RhGn8R3DtwR3llwBG5-FA/edit#gid=0

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

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

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

Вот код, который мне нужно добавить:

var nowTime = new Date();  
var timeZone = Session.getScriptTimeZone();
var nowTimeFormatted = Utilities.formatDate(nowTime, timeZone, 'MM/dd/yyyy HH:mm:ss');

любая идея о том, как улучшить этоСценарий или для решения оригинальной задачи без обходных путей приветствуется:)

0 голосов
/ 18 ноября 2018

А пока я добавил этот код, чтобы сохранить состояние фильтра и восстановить его в конце. Это не очень элегантно и все еще добавляет много шансов, что что-то напутает или сценарий потерпит неудачу, но это менее инвазивное решение, с которым я пришел. У кого-то есть лучше?

// at the beginning
if (sheet1.getFilter()){
     var filterRange= sheet1.getFilter().getRange();
     var filterSetting = [];
var i=0;
 while (i<filterRange.getNumColumns()-1) {filterSetting[i]= sheet1.getFilter().getColumnFilterCriteria(i+1);sheet1.getFilter().removeColumnFilterCriteria(i+1);i++; }
}
// At the end
 if (sheet1.getFilter()){
 var i=0;
 while (i<filterRange.getNumColumns()-1) {if (filterSetting[i]) sheet1.getFilter().setColumnFilterCriteria(i+1, filterSetting[i]);i++; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...