#javascript #google-apps-script #google-sheets
Вопрос:
Здравствуйте, ребята, я пытаюсь получить цены на криптовалюту с помощью формулы электронной таблицы Googles, ввод формулы в электронные таблицы Google работает просто отлично, и я получаю цены без каких-либо проблем.
=IMPORTXML("https://www.marketscreener.com/quote/cryptocurrency/BITCOIN-EURO-45553925/";"//td[@class='fvPrice colorBlack']")
Проблема: Пользовательские формулы, такие как IMPORTXML, не обновляются автоматически в электронной таблице, поэтому я использовал все методы Google, которые выполняют эту задачу, но ни один из них не работал. Пока я не нашел тот, который работает частично, он выполняет свою работу, но, к сожалению, удаляет ячейки вокруг моей формулы.
Это моя электронная таблица перед запуском метода Перед
Это моя электронная таблица после запуска метода После
И это тот метод, который частично работает:
/**
* Get all sheet names from active spreadsheet
*/
function sheetNames() {
var sheetNames = [];
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i = 0; i < sheets.length; i ) sheetNames.push( sheets[i].getName() )
return sheetNames;
}
/**
* Update all formula data in cell range
*/
function updateData() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(),
activeSheet = spreadsheet.getActiveSheet()
activeSheetName = activeSheet.getSheetName(),
activeRange = activeSheet.getActiveRange(),
sheets = sheetNames() // OR define an array of sheet names: ['Sheet1', 'Sheet2'],
// cellRange = (activeRange.getValues().length > 1) ? activeRange.getA1Notation() : Browser.inputBox('Enter your range'),
range = '';
// loop through all sheets
sheets.forEach(function(sheet) {
var originalFormulas = [],
range = activeRange,
defaultRanges = {
'europeList': 'A1:F9',
'europeList': 'A1:F9'
},
// set cell range if entered, ortherwise fall back to default
cellRange = defaultRanges[sheet];
// set range to active range, otherwise fall back to defined cell range
range = spreadsheet.getSheetByName(sheet).getRange(cellRange);
originalFormulas = range.getFormulas();
// modify formulas
const modified = originalFormulas.map(function (row) {
return row.map(function (col) {
return col.replace('=', '?');
});
});
// update formulas
range.setFormulas(modified);
SpreadsheetApp.flush();
// return formulas to original
range.setFormulas(originalFormulas);
});
}
У кого-нибудь есть идея, как это исправить?
Комментарии:
1. Что ты пропустил? Почему он нацелен на другие клетки?? Где на них ссылаются? Какие именно клетки? Затем найдите их в своем коде…
2. И почему ваше название не соответствует основной части вопроса?
3. Я добавил картинку «до и после», которая точно показывает проблему, есть свойство originalFormulas, которое должно хранить значения, а затем повторно их заполнять, для меня это имеет смысл, поэтому я просто не могу понять, почему это происходит
4. вы можете принудительно выполнить сброс
function refresh() { SpreadsheetApp.flush() }
и установить его на триггер времени. Или посмотрите на этот сценарий, который я написал для API CoinMarketCap. reddit.com/r/sheets/comments/o7h6db/…5. Я все еще не понимаю, если вы получаете цены, что не так? Они тоже обновляются автоматически, только не очень быстро. Я не уверен, чего вы пытаетесь достичь с помощью сценария.