Импорт данных из разных таблиц (медленно) - PullRequest
1 голос
/ 28 января 2020

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

Я бы хотел, чтобы мои формулы IMPORTRANGE обновляли sh один раз каждые 24 часа вместо каждый раз происходит модификация. Кажется, что importrange не позволяет этого, поэтому я ищу что-то похожее (сценарий, я полагаю). Я нашел это: Принудительно обновлять IMPORTRANGE через определенные промежутки времени (я знаю, что мне придется немного его изменить, так как этот скрипт экспортирует данные в другую электронную таблицу , и я бы хотел импорт из другой таблицы , но это должно быть выполнимо)

Я не тестировал этот скрипт, но перед тем, как попробовать, у меня есть пара вопросов:

  1. Есть ли более простое решение, может быть, формула, которая не требует сценария? Или функция, о которой я не знаю ...

  2. Если требуется скрипт, действительно ли этот вид скрипта (по ссылке выше) действительно эффективен для go ? Мне нужно изменить этот сценарий, чтобы иметь возможность импортировать из десятков различных электронных таблиц. Мне интересно, насколько медленным будет процесс импорта, поскольку сценарий будет выполнять десятки, сотни операций импорта каждую ночь (возможно, 5000 ячеек в каждый импорт)? Если это вопрос минут, не проблема, но если это означает часы, не так много.


Контекст: Я управляю агентством мероприятий. Для каждого потенциального клиента мы дублируем электронную таблицу «клиент». Когда потенциальный клиент подтверждает и становится клиентом, мы вставляем URL-адрес "клиентской" таблицы в основную электронную таблицу (одна строка = один клиент = один URL-адрес = один importrange в моей основной формуле)

Благодаря некоторому importrange формул и запросов, мы можем централизовать в этом файле в основном файле необходимую информацию обо всех событиях (см. «дополнительную информацию»)

Это работает нормально, но, конечно, когда количество клиентов стало больше, Основная таблица стала медленнее, и со временем она будет только ухудшаться.

Вот формула, которую я сейчас использую в главной таблице: =QUERY({IMPORTRANGE(Clients!$K3;"Data!B16:M");IMPORTRANGE(Clients!$K4;"Data!B16:M");IMPORTRANGE(Clients!$K5;"Data!B16:M"); etc etc etc};"Select * where Col1<>''";0)

Где клиенты! $ K - это столбец, в который мы вставляем URL-адрес таблицы "клиенты". Конечно, у нас есть еще много формул IMPORTRANGE (по одной на клиентскую строку)

Огромное спасибо за любую помощь по этому вопросу!

1 Ответ

2 голосов
/ 29 января 2020

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

Поскольку в вашей электронной таблице достаточно данных, лучшей альтернативой будет использование сценария.

Обходной путь :

Вы можете попробовать использовать этот скрипт и использовать триггер, который запустит его выполнение в указанное вами время вместо использования IMPORTRANGE который пересчитывает данные каждые 30 минут.

function importRange() {
  var ss = SpreadsheetApp.openById("15P9QT4ukwQYnsF7RiHH-e1sSHlK7oyKqhbteiw0_sxQ");
  var sourceSheet = ss.getSheetByName("Data");
  var urlsSheet = ss.getSheetByName("URLs");
  var urls = urlsSheet.getRange("B2:B").getValues();
  var j=1;
  for (var i=0;i<urls.length;i++) { 
    if (urls[i][0] != "") {
      var valuesToImport = SpreadsheetApp.openByUrl(urls[i][0]).getSheetByName("ClientData").getRange(1,1,3,2).getValues();
      sourceSheet.getRange(j,1,3,2).setValues(valuesToImport);
      j=j+3;
    }
   }
}

Сценарий работает, собирая все URL-адреса, проверяя, не являются ли URL-адреса пустыми ячейками, и если да, то получает нужные данные и вставляет их в Data лист. Поскольку данные, которые нужно вставить в лист, имеют строки 3 , чтобы можно было выполнить эту операцию, выбрав подходящий диапазон без перезаписи ячеек, была использована переменная j.

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

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

Создать триггер

enter image description here

Настройки триггера

enter image description here

Несколько советов, как избежать длительного ожидания:

  • Используйте ссылки на закрытый диапазон - , например, вместо B16:M, вы можете использовать B16:M500 (при условии, что данные, которые вы хотите, заканчиваются на M500).

  • Использование скрипта приложений ;

  • Миграция в базу данных ase - если ваша электронная таблица становится слишком медленной по вашему вкусу, вы всегда можете попробовать альтернативные варианты - например, использовать базу данных для хранения ваших данных и выполнения всех необходимых операций.

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

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