Скрипт для обновления ImportHTML с помощью флажка в Google Таблицах

#google-apps-script #google-sheets #import

#google-apps-script #google-sheets #импорт

Вопрос:

Предыстория

Я создаю большую электронную таблицу с различными экономическими показателями, и из-за отсутствия цен на сырьевые товары в функции Google Finance мне приходится использовать ImportHTML для получения данных из серии таблиц Business insider. Однако я не хочу, чтобы функция ImportHTML обновлялась автоматически так часто, потому что я не хочу, чтобы она работала в фоновом режиме, когда мне это не нужно. Я пытался заставить его обновлять данные всякий раз, когда я нажимаю флажок, и скрипт автоматически снимает флажок.

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

= Обновить IMPORT(input1, input2, input3, inputx)

= Обновить IMPORT(B3, C3, D3)

Внизу приведен пример того, как это будет выглядеть. Все входные данные после input1 будут необязательными. Итак, цель состояла бы в том, чтобы иметь возможность вставлять его в оператор IF в электронной таблице, и он «обновлял» содержимое входных ячеек.

Текущий скрипт

Поскольку я новичок в javascript, я обратился к макросам, чтобы попытаться разобраться в этом, но я бы хотел, чтобы оператор IF зависел от флажка.

 function RefreshCheckmark() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('Q6').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getActiveRange().setFormula('=importhtml("https://markets.businessinsider.com/commodities", "table", 2)');
  spreadsheet.getRange('Q12').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getActiveRange().setFormula('=importhtml("https://markets.businessinsider.com/commodities", "table", 3)');
  spreadsheet.getRange('Q21').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getActiveRange().setFormula('=importhtml("https://markets.businessinsider.com/commodities", "table", 4)');
  spreadsheet.getRange('Q29').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getActiveRange().setFormula('=importhtml("https://markets.businessinsider.com/commodities", "table", 5)');
  spreadsheet.getRange('Y4').activate();
  spreadsheet.getCurrentCell().setValue('FALSE');
}; 

С помощью этого макроса я попытался создать оператор IF на самом листе, который не будет работать, потому что у него нет разрешения. (хотя я дал ему разрешение) Вот оператор IF, который я пытался использовать на листе: (Y4 — ячейка с флажком)

=IF(Y4 = TRUE, RefreshCheckmark(), «Обновить скрипт»)

Итак, теперь мне трудно преобразовать макрос в функцию, которую я описал в разделе «Фон». Я возился с этим весь день, и у меня закончились идеи.

Ответ №1:

Я считаю, что ваша цель и ваша текущая ситуация заключаются в следующем.

  • Вы хотите запустить функцию RefreshCheckmark() , когда флажок установлен.
  • Ваш скрипт RefreshCheckmark() работает нормально.
  • Флажок ставится в ячейку «Y4».

Точки изменения:

  • К сожалению, пользовательская функция не может использоваться setValue . Я думаю, что причина вашей проблемы wouldn't work because it doesn't have permission to. . Ссылка
  • Чтобы использовать метод setValue , когда флажок установлен, в этом ответе я хотел бы предложить использовать триггер onEdit. Когда вышеуказанные пункты отражаются в скрипте, он становится следующим.

Пример сценария:

Пожалуйста, скопируйте и вставьте следующий скрипт в редактор сценариев и сохраните проект. И, пожалуйста, установите флажок «Y4». При этом скрипт onEdit() автоматически запускается простым триггером onEdit, и ваш скрипт RefreshCheckmark() также запускается.

 function onEdit(e) {
  const sheetName = "Sheet1";  // Please set the sheet name which has the checkbox at the cell "Y4".
  const range = e.range;
  if (range.getSheet().getSheetName() != sheetName || range.getA1Notation() != "Y4" || !range.isChecked()) return;

  RefreshCheckmark();  // This is your script.
}
 

Примечание:

  • В этом ответе предполагается, что ваш скрипт RefreshCheckmark() работает нормально, как вы и ожидали.

Ссылки:

Комментарии:

1. @Aerials Благодарим вас за проверку и редактирование. А также, спасибо за вашу постоянную поддержку.