试图理解 setFormula 与 setValue 的行为

Lol*_*olo 2 google-sheets google-apps-script

这只是我在这里的第三篇文章。我从未编码,我没有技能,我只是想学习一些概念,以便我可以“修复”Google Apps 脚本。

问题:我想了解setFormulasetValue行为,为什么细胞值更新与否。

我正在使用UrlFetchApp.fetch从 URL 获取一些值并在单元格中设置该值。

我正在用setFormulaor写入值setValue

这些功能是从工作表中的菜单手动触发的(未在下面的脚本中编码)

所以我从“Url”获取数据并将它们写在单元格上。

函数的第一次运行:

如果 URL 中的数据为:“A”,则:

-->setFormula写“A” -->setValue写“A”

函数的第二次运行:

URL中的数据从“A”变为“B”,则:

-->setFormula不覆盖单元格,仍然是“A” -->setValue用“B”覆盖“A”

我知道脚本正在按预期运行,完全没有问题。我只是想了解为什么setFormula从上次运行中“知道”单元格已经写入,因此它不会更新值。

这是解释问题的简短脚本。Url 值设置在工作表上, https://engaliao.com/html.htm 正如您在此图片中看到的那样

在此处输入图片说明


function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {name: "Formula", functionName: "runFormula"},
    {name: "SetValue", functionName: "runSet"}

  ];
  sheet.addMenu("Menu", entries);
}

function runFormula() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
    'hoja'
  );
  activeSheet.getRange(2, 2).setFormula('=RunCheck' + '(A2)');
}

function runSet() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(
    'hoja'
  );
  var workingCell = activeSheet.getRange(3, 1).getValue();
  activeSheet.getRange(3, 2, 1, 1).setValue(RunCheck(workingCell));
}

function RunCheck(Url) {
  var array = [];
  var response = UrlFetchApp.fetch(Url);
  if (response.getResponseCode() == 200) {
    var content = JSON.parse(response.getContentText());
    var score = content['loadingExperience']['id'];
  }
  array.push([score]);
  return array;
}

Run Code Online (Sandbox Code Playgroud)

不需要外部提取来解释我的问题的新简化脚本:

在此处输入图片说明

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {name: "Formula", functionName: "runFormula"},
    {name: "SetValue", functionName: "runSet"}

  ];
  sheet.addMenu("Menu", entries);
}



function runFormula() {
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("hoja");


    activeSheet.getRange(2, 2).setFormula("=RunCheck" + "(A2)");

     }   


function runSet() {
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("hoja");

          var workingCell = activeSheet.getRange(3, 1).getValue();

          activeSheet.getRange(3,2,1,1).setValue(RunCheck(workingCell));


}



function RunCheck(text) {

    var array = [];

   var number = (Math.random())



    array.push([text + " " + number]);

    return array;
}
Run Code Online (Sandbox Code Playgroud)

Coo*_*per 5

您的主张不可重复

我使用这些函数来测试您的声明,即如果 setForumula 在单元格中检测到某些内容,它不会更改公式,我发现无论它是否已被 setFormula 或 setValue 更改,它都会更新公式,并且实际上两者都会更新公式。

function setMyValue() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Sheet40');
  const v=sh.getActiveCell().getFormula();
  sh.getRange('A1').setValue(v);
  ss.toast(sh.getRange('A1').getFormula());
}

function setMyFormula() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Sheet40');
  const v=sh.getActiveCell().getFormula();
  sh.getRange('A1').setFormula(v);
  ss.toast(sh.getRange('A1').getFormula());
}
Run Code Online (Sandbox Code Playgroud)

那么如何分享您的菜单驱动功能。也许这就是问题所在。

动画片:

在此处输入图片说明