Как автоматически обновить пользовательскую формулу в таблицах Google spredsheets без потери ячеек?

#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. Я все еще не понимаю, если вы получаете цены, что не так? Они тоже обновляются автоматически, только не очень быстро. Я не уверен, чего вы пытаетесь достичь с помощью сценария.