0

I have a script that automatically updates my formula to get new data, but it works like a timer and all data is overwritten again and again. After running the script, I need to get new data to be written into a new cell.

My aim is to create a script that:

  • add new cells with formula
  • delete only the formula and not previously written data from previous cell
  • automatically update the next cell

What should be the approach to achieve that? This is the piece of code that I have.

/**
* Go through all sheets in a spreadsheet, identify and remove all spreadsheet
* import functions, then replace them a while later. This causes a "refresh"
* of the "import" functions. For periodic refresh of these formulas, set this
* function up as a time-based trigger.
*  - Caution: Formula changes made to the spreadsheet by other scripts or users
* during the refresh period COULD BE OVERWRITTEN.
*  - From: https://stackoverflow.com/a/33875957/1677912
*/
function RefreshImports() {
  var lock = LockService.getScriptLock();
  if (!lock.tryLock(5000)) return;             // Wait up to 5s for previous refresh to end.
  // At this point, we are holding the lock.

  var id = "YOUR-SHEET-ID";
  var ss = SpreadsheetApp.openById(id);
  var sheets = ss.getSheets();

  for (var sheetNum=0; sheetNum<sheets.length; sheetNum++) {
    var sheet = sheets[sheetNum];
    var dataRange = sheet.getDataRange();
    var formulas = dataRange.getFormulas();
    var tempFormulas = [];
    for (var row=0; row<formulas.length; row++) {
      for (col=0; col<formulas[0].length; col++) {
        // Blank all formulas containing any "import" function
        // See https://regex101.com/r/bE7fJ6/2
        var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
        if (formulas[row][col].search(re) !== -1 ) {
          tempFormulas.push({row:row+1,
                             col:col+1,
                             formula:formulas[row][col]});
          sheet.getRange(row+1, col+1).setFormula("");
        }
      }
    }

    // After a pause, replace the import functions
    Utilities.sleep(5000);
    for (var i=0; i<tempFormulas.length; i++) {
      var cell = tempFormulas[i];
      sheet.getRange( cell.row, cell.col ).setFormula(cell.formula)
    }

    // Done refresh; release the lock.
    lock.releaseLock();
  }
}
Tomalak
  • 332,285
  • 67
  • 532
  • 628
  • *EDIT*I think it must work like: script that copy from previous cell formula and add new cells with formula and then delete only formula(not value) from previous cell -> script to autoupdate – Stephen Bender Aug 30 '19 at 13:38
  • 1
    From the first glance and without knowing anything else, you are releasing the lock at the wrong point. The `lock.releaseLock();` should be outside of the loop. – Tomalak Aug 30 '19 at 17:22
  • Ok thanks i will try – Stephen Bender Aug 31 '19 at 15:25

0 Answers0