Range # sort не может сортировать на основе значений новой формулы - PullRequest
0 голосов
/ 19 марта 2019

Я извлекаю данные из нескольких листов Google на один основной лист, используя скрипт Google Apps.Чтобы преобразовать даты в номера недель, я использую функцию листа ISOWEEKNUM() для столбца 1. Я хочу отсортировать по номерам недель, а из-за заголовков я использую Range#sort.

Проблема, с которой я столкнулся, заключается в том, что при выполнении теста getData() сортировка не выполняется, вызов Range#sort не действует.Если я сначала запускаю getData(), а затем вручную запускаю мою функцию sortRange(), она работает.

Есть ли что-то в записи ячеек с ISOWEEKNUM() в них, а затем попытаться выполнить сортировку напрямую в том же исполнении скрипта?Что можно сделать, чтобы решить эту проблему без необходимости сортировки или запуска большего количества сценариев вручную?

function getData()
{
  var thisSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = thisSpreadSheet.getSheetByName('Data');
  var deliverySheets = listDeliverySheets();

  var outputWeekAndTotal = [];
  var outputCratesPerStore = [];
  var i;
  for(i = 0; i < deliverySheets.length; i++)
  {
    outputWeekAndTotal.push(["=ISOWEEKNUM(\""+deliverySheets[i].getRange("A2").getDisplayValue()+"\")", deliverySheets[i].getRange("L12").getValue()]);
    outputCratesPerStore.push(deliverySheets[i].getRange("L5:L9").getValues());    
  }

  dataSheet.getRange(2, 1, outputWeekAndTotal.length, outputWeekAndTotal[0].length)
    .setValues(outputWeekAndTotal);
  dataSheet.getRange(2, 3, outputCratesPerStore.length, outputCratesPerStore[0].length)
    .setValues(outputCratesPerStore);
  sortRange();
}

function sortRange()
{
  var thisSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var rangeToSort = thisSpreadSheet.getSheetByName('Data').getRange(2, 1, 7, 7); /*Constants used temporarily*/
  rangeToSort.sort({column: 1, ascending: true});
}

1 Ответ

1 голос
/ 19 марта 2019

Основная проблема заключается в том, что Google может (и оптимизирует) оптимизировать их интерпретацию вашего кода , чтобы избежать злоупотребления их серверами.Когда вы вызываете функции, которые работают с различными объектами, Google не всегда определяет важность этого порядка и, таким образом, может вызывать определенные операции API из (вашего желаемого) порядка.Вы можете помочь Google, связав методы с одним и тем же объектом, но этого не всегда достаточно.Операции, которые вызывают побочные эффекты / асинхронные изменения, такие как написание формулы или операции над другими API, например, вызов API / службы Drive после использования методов Form, Docs или Sheets Service, могут не выполняться по порядку, даже если они «связаны». "

Чтобы это исправить, вы должны принудительно очистить буфер кэша записи.Для службы электронных таблиц это делается с помощью вызова SpreadsheetApp#flush.

  ...
  dataSheet.getRange(...).setValues(...);
  SpreadsheetApp.flush();
  sortRange();
}

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

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