Обработка изменений листа в Google Sheets API - PullRequest
1 голос
/ 16 января 2020

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

  • Google Sheets API не имеет запроса на проверку времени последнего изменения файла или файла версия. (Поправьте меня, если я ошибаюсь)

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

Например:

Файл в версии 10.

  1. Отправка BatchUpdateRequest с некоторыми данными
  2. По окончании предыдущего запроса проверка версии файла с помощью DriveAPI Files.Get запрос с полем "version" и получите старую версию 10

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

Чтобы преодолеть эти проблемы, я реализовал logi c с локальным вычислением версии электронной таблицы и сравнением ее после загрузки: если онлайн-версия> будет загружена локальная электронная таблица. Но это создает новую проблему:

Если внести изменения в электронную таблицу с нескольких компьютеров за несколько минут, локальная версия на всех компьютерах будет увеличена, но Google объединяет эти изменения в одну версию. Таким образом, для правильной работы это должен быть oldversionnubmer + countOfComputersThatMakesChanges, но на самом деле это oldVersionNumber + 1. Таким образом, никто не получит фактические данные электронной таблицы, потому что онлайн-версия не будет выше локальной.

Таким образом, у меня есть вопрос: Как я могу обновлять электронные таблицы при изменении данных из другого источника?

GoogleSpreadsheetsVersions заполнение так:

var versions = Instance.GoogleSpreadsheetsVersions;

    if (!versions.ContainsKey(newTable.SpreadsheetId)) {
                        var request = GoogleSpreadsheetsServiceDecorator.Instance.DriveService.Files.Get(newTable.SpreadsheetId);
                        request.Fields = "version";
                        var response = request.Execute();
                        versions.Add(newTable.SpreadsheetId, response.Version);
                    }

само сравнение версий:

            var newInfo = new Dictionary<string, long?>();
            foreach (var info in GoogleSpreadsheetsVersions)
            {
                try
                {
                    //Gets file version
                    var request = GoogleSpreadsheetsServiceDecorator.Instance.DriveService.Files.Get(info.Key);
                    request.Fields = "version";
                    var response = request.Execute();

                    // local version < actual google version
                    if (info.Value < response.Version)
                    {
                        // setting flag of reloading for each sheet from this file
                        foreach (var t in GoogleSpreadsheets.Where(sheet => sheet.SpreadsheetId == info.Key))
                            t.IsLoadRequestRequired = true;
                    }
                    //Refreshing local versions
                    newInfo.Add(info.Key, response.Version);
                }
                catch (Exception e) when (e.Message.Contains("File not found"))
                {
                    newInfo.Add(info.Key, null);
                }
            }
            GoogleSpreadsheetsVersions = newInfo;

PS:

  • описание поля версии из руководства Google: монотонно увеличивающийся номер версии файла. Это отражает все изменения, внесенные в файл на сервере, даже те, которые не видны пользователю.

  • Локальный класс таблицы в коде означает данные одного листа в Google. Таким образом, если одна электронная таблица Google содержит 10 листов, в программе будет 10 электронных таблиц.

  • Может быть полезно DriveAPI.Files.Get filedes

...