Google Scripts - запускать одну функцию за другой - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь написать Google Script, который связан с Google Sheet и делает несколько изменений при редактировании.При любом изменении сценарий должен повторно отсортировать строки по определенному столбцу.При изменении в определенном столбце сценарий должен создать значение даты в соседнем столбце этой строки (т. Е. Если вы редактируете C2, он должен создать дату в D2, соответствующую дате редактирования).

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

Я редактирую C2, поэтому он создает дату в D2.Но, по-видимому, за до он делает это, пересортирует строки, так что отредактированная строка теперь находится в новом месте, а дата появляется в неправильной строке.(Я думаю, что было бы точнее сказать, что он сортирует строки , а обрабатывает функцию для добавления даты).

Конечный результат состоит в том, что ячейка даты заполняется в правильной строке численно (т.е. D2), но содержимое строки 2 к этому моменту перемещено в другое место, поэтому оно находится в неправильном содержимом строки-wise.

Вот мои функции:

function reSort() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getActiveSheet();
 var range = sheet.getRange("A2:C1000");

 // Sorts descending by column B
 range.sort({column: 3, ascending: true });
}

function saveDate (event) {
  var ss = event.source; 
  var range = event.range;
  var a1 = range.getA1Notation();
  var col = a1[0];
  var row = a1.slice(1);

  // If status has just been modified
  if (col === 'C' && a1.length >= 1) {
    var dateCell = ss.getRange('D'.concat(row)).getCell(1,1);

    // Empty date if status is null
    if (event.value === '') {
      dateCell.setValue('');
    // Otherwise, add date
    } else {
      var date = new Date();
      dateCell.setValue([date.getMonth() + 1, date.getDate(), date.getFullYear()].join('/'))
    }
  }
}

function saveDateAndResort(event) {
  saveDate(event);
  reSort();
}

Кажется, что решение состоит в том, чтобы запустить одну функцию, а затем другую (в частности, сохранить дату, а затем применить).Это то, что я пытаюсь сделать в saveDateAndResort, это функция, которая срабатывает.Но то же самое асинхронное поведение все еще, кажется, происходит.Я бы хотел запустить один и , затем другой, только после завершения первого, но когда я попробовал setTimeout, он не работал (в частности, кажется, что он игнорирует содержимое внутри функции тайм-аута).вызов).

Я что-то упускаю или делаю что-то не так?Это, кажется, ведет себя странно.

1 Ответ

0 голосов
/ 18 декабря 2018

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

Фрагменты:

function saveDateAndResort(event) {
  saveDate(event);
}
function saveDate(event){
  //code to save date here
  SpreadsheetApp.flush();//flush cache 
  reSort();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...