Очень поздно с вопросом. Недавно мне пришлось сделать нечто подобное. Я подумал, что напишу что-нибудь здесь, чтобы другие могли найти для себя что-то полезное... надеюсь.
Случай использования
Я хотел, чтобы моя таблица Google вызывала IMPORTDATA
по определенному URL-адресу каждые несколько минут, потому что данные, хранящиеся по этому URL-адресу, изменялись с помощью триггера таймера и триггера Http. Функция Azure.
По сути, я хотел, чтобы моя таблица Google обновлялась каждые 5 минут, потому что я знал, что данные по URL-адресу постоянно меняются.
Что я пробовал:
Я начал со сценария, похожего на то, что упоминал @greg. (Приветствую вас.) Я установил триггер таймера для этого скрипта на 5 минут. Все выглядело симпатично.
Проблемы
Я понял, что установка функции в качестве значения в ячейке приводила к тому, что функция запускалась только в начале, когда лист был пуст. При втором срабатывании триггера лист не обновлялся. Так что я попытался
cell.setValue("");
cell.setValue('=IMPORTDATA("my-url")');
Не повезло. Лист не обновился новыми данными. Казалось, что лист увидел, что устанавливаемое значение в ячейке совпадает с существующим значением, поэтому не стал перезапускать функцию.
Чтобы подтвердить свою гипотезу,
я попробовал вручную:
- Вырежьте функцию IMPORTDATA из ячейки гугл листа.
- Вставьте значение обратно в ячейку.
Лист не обновлялся.
Но когда я попытался вручную:
- Удалить/изменить URL из/в ячейке. Нажмите Enter.
- Снова вставьте формулу в ячейку. Нажмите Enter.
Это сработало. Таким образом, кажется, что cell.SetValue()
или даже cell.setFormula()
просто не перезапускают функцию, которую я устанавливал, потому что та же самая функция существовала в ячейке с самого начала.
Мое решение лучше всего подходит для моего варианта использования:
Поскольку данные по URL-адресу, на который я указывал, уже были в формате CSV, я сделал что-то вроде этого:
var firstSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
var text = UrlFetchApp.fetch(url).getContentText(); //gets the data.
var csv = Utilities.parseCsv(text); //parses the data.
var range = firstSheet.getRange(1, 1, csv.length, 17) //getting the range.
range.setValues(csv); //setting the data.
Я в основном беру данные из URL-адреса и помещаю их в лист по таймеру вместо вызова функции IMPORTDATA
, поскольку этот подход не совсем сработал для меня.
Вы можете сделать то же самое, предположив, что хотите получить содержимое таблицы или диаграммы и сохранить значения на листе.
person
Yash Karan Singh
schedule
14.08.2020