Google Script: обновление отдельной ячейки с помощью формулы IMPORTDATA - PullRequest
0 голосов
/ 27 июня 2019

У меня есть одна формула IMPORTDATA в ячейке A1 листа Google с именем «test-r», и я хотел бы иметь возможность обновлять ячейку через определенный интервал - от секунд до часов.

После большого количества исследований я обнаружил это предложение в предыдущем посте , но я не добился большого успеха с ним.

Вот как я изменил сценарий в этом посте для своей формулы IMPORTDATA в ячейке A1 моего имени листа / вкладки "test-r"

function forceEval(sheetName, Row, Col){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("test-r");
  var orig = sheet.getRange(1,1).getFormula(); 
  var temp = orig.replace("=", "?");
  sheet.getRange(row,col).setFormula(temp); 
  SpreadsheetApp.flush();
  sheet.getRange(row,col).setFormula(orig); 
}

function onEdit(e){
    forceEval("test-r", 1, 1)
}

Это должно быть "ошибка оператора" с моей стороны, и я новичок в этом.

В то же время я не знаю, существует ли более упрощенный сценарий для достижения моей цели.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 27 июня 2019
  • Вы хотите обновлять функцию ячейки "A1" каждый определенный интервал времени.

Если мое понимание верно, как насчет этой модификации?

Точки модификации:

  • В вашем скрипте используется триггер события OnEdit.В этом случае при редактировании ячейки срабатывает триггер.
    • Я думаю, что это может не подходить для вашей ситуации.
    • Как насчет использования триггера, управляемого по времени?
  • В некоторых случаях есть орфографические ошибкитвой сценарийПри этом переменные не используются, и возникает несколько ошибок.

Когда вышеуказанные точки отражаются в вашем скрипте, это становится следующим:

Модифицированный скрипт 1:

function forceEval(){ // Modified
  var sheetName = "test-r";
  var cell = "A1";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName); // Modified
  var orig = sheet.getRange(cell).getFormula(); // Modified
  var temp = orig.replace("=", "?");
  sheet.getRange(cell).setFormula(temp); // Modified
  SpreadsheetApp.flush();
  sheet.getRange(cell).setFormula(orig); // Modified
}
  • После того, как вы изменили сценарий, для выполнения функции forceEval() каждый определенный интервал времени, пожалуйста, установите управляемый по времени триггер.
  • В этом сценарии #NAME?отображается на мгновение.Если вы не хотите этого делать, как насчет следующего примера скрипта?

Модифицированный скрипт 2:

function forceEval(){
  var sheetName = "test-r";
  var cell = "A1";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var range = ss.getSheetByName(sheetName).getRange(cell);
  var formula = range.getFormula();
  range.clearContent();
  SpreadsheetApp.flush();
  range.setFormula(formula);
}

Установить управляемый по времени триггер:

Чтобы установить управляемый по времени триггер, вы можете установить его вручную .

Также вы можете установить его с помощью скрипта.Следующий скрипт устанавливает управляемый временем триггер для функции forceEval.В этом примере сценария, когда запускается setTrigger(), функция forceEval() запускается каждые 10 минут.При этом формула ячейки «А1» обновляется каждые 10 минут.

function setTrigger() {
  var minutes = 10; // In this case, as a sample value, it's 10 minutes.
  var functionName = "forceEval";

  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == functionName && triggers[i].getTriggerSource() == ScriptApp.TriggerSource.CLOCK) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
  ScriptApp.newTrigger(functionName).timeBased().everyMinutes(minutes).create();
}

Ссылка:

Если я неправильно понял ваш вопрос, и это было не то направление, которое вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...