Как я могу заставить Google Sheets автоматически обновлять ссылку на другой лист?


20

Я использую внешнее приложение для ввода данных в таблицу Google. Затем на эту рабочую книгу ссылается отдельная рабочая книга (с IMPORTRANGE(spreadsheet_key, range_string)функцией), которая манипулирует и интерпретирует данные. Моя проблема в том, что всякий раз, когда я лично изменяю указанную рабочую книгу, справочная рабочая книга обновляется очень хорошо, но всякий раз, когда внешнее приложение изменяет ее, она не обновляется.

Я попытался отредактировать «Настройки таблицы», чтобы пересчет выполнялся каждую минуту и ​​при каждом изменении. Кроме того, я также установил расширение в Google Chrome, которое автоматически обновляет страницу каждый час. Однако данные не будут повторно импортированы из указанной рабочей книги. Даже если я скопирую формулу в новую ячейку, данные все равно не будут повторно импортированы.

Могу ли я что-нибудь сделать со справочной книгой, чтобы Google Sheets повторно импортировал данные?

Изменить: Просто чтобы прояснить ситуацию, у меня в настоящее время есть одна рабочая книга с данными, введенными внешним приложением (назовите ее «исходный лист»), и другая рабочая книга с IMPORTRANGEфункцией в ней (назовите ее «ссылочный лист»). Данные, показанные IMPORTRANGEфункцией в «справочном листе», не включают никаких данных, введенных внешним приложением, так как я в последний раз редактировал «исходный лист». Кроме того, обе книги используют новые Google Sheets.

Изменить: Кроме того, этот вопрос не совпадает с тем, как связать ячейку в таблицах Google с ячейкой в ​​другом документе? потому что я использую функцию, предоставленную в качестве решения этого вопроса, для импорта данных из электронной таблицы. Проблема не в том, как импортировать данные, а в том, как обновить источник данных. Я предполагаю, что Google позаботился бы об этом для меня, но данные в «справочном листе» не обновляются, и единственный способ найти обновление - это физически перейти на «исходный лист». "и отредактируй это сам.


Я не знаю деталей о том, как это работает, но я использую следующее: ifttt.com/google_drive
tlewis3348

@pnuts Можете ли вы объяснить, что вы подразумеваете под «гарантией того, что в качестве источника используется правильная версия»? У меня есть настройки для обоих листов, которые обновляются каждую минуту, а вкладки обновляются каждую минуту. Как, где и на каком листе мне обновить источник?
tlewis3348

@pnuts Ну, данные отображаются в separate workbookпорядке.
Судя по

Да, это новый Google Sheets. Одна рабочая книга показывает добавленные данные, а другая - нет. Я добавлю это к первоначальному вопросу для уточнения.
tlewis3348

Ответы:


14

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

Моя формула ранее выглядела примерно так:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174","'Sheet1'!A1:B25")

И теперь это выглядит так:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174"&"?"&now(),"'Sheet1'!A1:B25")

Обновить:

Этот метод больше не работает, так как Google больше не позволяет now()внутри importrange(). Смотрите комментарий от Хью ниже.


6
Я сталкивался с этим ответом, пытаясь сделать то же самое. Похоже, что Google сделал это так, что now (), rand () и randbetween () не могут использоваться внутри вызова importrange ().
Хью

Если я настрою электронную таблицу обновлять каждую минуту, получит ли формула обновленные данные и получит новые данные (если они есть)?
Нихил Саху

5

Следующее приходит от Джимми в этом ответе веб-приложений .

  1. В обеих таблицах вставьте =now()уравнение в случайную ячейку, скажемZ1
  2. В обеих электронных таблицах вставьте =importrange()функцию, которая ссылается на nowфункцию другой электронной таблицы.
  3. Зайдите в настройки электронной таблицы и выберите пересчет на каждую минуту.

Я перепробовал множество других предложений, в том числе с помощью =now()функции, трюка с URL-адресом в этой теме или приложения Apps Script для вставки произвольного текста с заданным интервалом, но ничто не заставило бы importrange обновиться, кроме ручного редактирования исходного листа.


Работал для меня в декабре 2018 года
MalcolmOcean

4

Я обнаружил, что самым простым способом было сделать простое ifзаявление по всему importrange.

B1 = Sheet ID
B2 = Sheet Name and Range
B3 = Now()
=if (B3> now()-1, IMPORTRANGE(B1,B2),)

Это работает каждый раз.


Я пытался реализовать ваше решение, но мне неясно, как использовать B3. Вы говорите, что B3 = Сейчас () тогда=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
Евгений ван дер Мерве

3

Мне кажется, что обходной путь с датой не работает - есть явное замечание, что использование дат и меток rand недопустимо.

Мой очень хакерский обходной путь - удалить ячейку и нажать Ctrl + Z. Это заставляет освежиться каждый раз. Это просто для сценария этого открытого или через определенные промежутки времени, чтобы сохранить данные свежими.


2

Я нашел простой хак для имитации ручного обновления ячейки и запуска модификаций во внешней таблице.

  1. Создал пользовательскую функцию, подобную этой:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. Затем на своем листе я называю это так:

    =arrayformula(hack(tab!B1))
    

    где tab!B1одна из ячеек, которые я изменяю кодом.


Как это имитирует обновление ячейки вручную?
haemse

2

ИЛИ ... вы могли бы сделать простой сценарий, сначала давая значение cero (0), затем включая формулу обратно, и это делает свое дело:

  var cell = sheet.getRange("B1:B1"); //SHEET TO INSERT VALUE
  cell.setFormula("=0");
   Utilities.sleep(2000); //JUST TO GIVE TIME TO UPDATE (OPTIONAL)
  var cell = sheet.getRange("B1:B1");
  cell.setFormula("=ImportRange(\"YOUR_SHEET_ID\",\"RANGE_TO_INSERT\")");  

еще лучше будет cell.setFormula ("=" & cell.getValue ()); чтобы пользователь не видел ноль в течение 2 секунд ....
Тони БенБрахим

1

Мне удалось найти способ решить мою проблему (подробно здесь ) с помощью скрипта приложений с пользовательской функцией.

Если вы замените =IMPORTRANGE(spreadsheet_url, range_string)в таблице электронную таблицу =DynamicImportRange(spreadsheet_url, sheet_name, range)и вставите приведенный ниже код в Инструменты -> Редактор сценариев -> Пустой проект, он должен работать (см. Это для получения дополнительной информации о написании сценариев приложений).

/**
Usage: =DynamicImportRange(spreadsheet_url, sheet_name, range)
Compare to: =IMPORTRANGE(spreadsheet_url, range_string)

Where the given arguments are placeholders that should be replaced
by arguments specific to your use-case.
 */
function DynamicImportRange(sheet_url, sheet_name, sheet_range) {
  var values = SpreadsheetApp.openByUrl(sheet_url).getSheetByName(sheet_name).getRange(sheet_range).getValues();
  return values
};

/**
*/
function RefreshSheet() {
  // Update the following two variables to suit your particular situation
  var sheet_name = "sample_sheet_sheet"
  var range = "A1"

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
  var formula1 = "Loading...";
  var formula2 = sheet.getRange(range).getFormula().toString().replace('"', '\"');
  // The following assumes that the data is being inserted into the sheet in the same
  // location as it is in in the source sheet.
  var form_range = formula2.split(",")[2].split("\"")[1];
  sheet.getRange(form_range).clear();
  sheet.getRange(range).setValue(formula1);
  Utilities.sleep(245);
  sheet.getRange(range).setValue(formula2);
};

Если вы хотите, чтобы лист обновлялся на регулярной основе, вы можете настроить триггер, перейдя в Ресурсы -> Триггеры текущего проекта в окне Сценарий приложений.


4
ДЛЯ ВСЕХ ГУГЛЕРОВ КОНЕЦ ЗДЕСЬ : пользовательские функции электронных таблиц не могут (больше) открывать другие электронные таблицы, используя SpreadsheetApp.openById()или SpreadsheetApp.openByUrl(). Проверьте здесь и здесь
Франческо Вадикамо

1

В качестве обходного пути для создания now()контрольно-пропускного пункта вы можете изменить настройки электронной таблицы, чтобы они обновлялись каждый час.

Файл -> Настройки электронной таблицы -> Расчет

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


0

Вы можете использовать дополнение Sheetgo для Google Sheets, чтобы автоматически обновлять вашу ссылку с другого листа. Вы можете использовать 30 обновлений бесплатно в месяц или получить платную подписку на дополнительные обновления. Это видео должно объяснить вам основное использование.


2
Пожалуйста, имейте в виду, что, хотя на сайте « Установка бесплатно » это умно указано , это дополнение с одним ограниченным бесплатным планом, за которым следуют 3 платных . Ссылка на страницу с ценами находится только в самом низу сайта.
marikamitsos
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.