#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 Благодарим вас за проверку и редактирование. А также, спасибо за вашу постоянную поддержку.