Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 谷歌应用程序脚本-根据另一个单元格的值设置活动单元格的公式_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 谷歌应用程序脚本-根据另一个单元格的值设置活动单元格的公式

Google apps script 谷歌应用程序脚本-根据另一个单元格的值设置活动单元格的公式,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在谷歌应用程序脚本中编写一个自定义函数,如果某个其他单元格包含一个数字,则使用该单元格和其他几个单元格的值来计算结果。否则,如果某个其他单元格不包含数字,则函数只应返回一个空字符串,以便活动单元格显示为空。 我能够想出一个工作函数来做这件事,但为了保护敏感信息,我不打算在这里复制它。相反,这里有一个实现相同功能的示例函数: function myFunction() { var sheet = SpreadsheetApp.getActiveSheet(); var rowNum =

我正在谷歌应用程序脚本中编写一个自定义函数,如果某个其他单元格包含一个数字,则使用该单元格和其他几个单元格的值来计算结果。否则,如果某个其他单元格不包含数字,则函数只应返回一个空字符串,以便活动单元格显示为空。
我能够想出一个工作函数来做这件事,但为了保护敏感信息,我不打算在这里复制它。相反,这里有一个实现相同功能的示例函数:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rowNum = sheet.getActiveCell().getRow();
  var rowVals = sheet.getRange(rowNum, 1, 1, 15).getValues();

  var fVal = rowVals[0][5];
  if (fVal == "" || isNaN(fVal)) {
    return "";    //leave cell blank if column F doesn't contain a number
  }

  var aVal = rowVals[0][0];
  var bVal = rowVals[0][1];
  var cVal = rowVals[0][2];
  var gVal = rowVals[0][6];

  return ((gVal * fVal) + aVal + bVal + cVal);
}
但是,为了加快计算速度(还有一些其他原因,在这里要解释会很复杂,所以你必须相信我),我希望自定义函数将单元格的值设置为一个公式,而不是自己进行计算。首先将公式放在单元格中是行不通的,因为即使F列不包含数字,它仍会计算/显示结果。 以下是我迄今为止所尝试的:

function myFunction2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rowNum = sheet.getActiveCell().getRow();
  var fVal = sheet.getRange(rowNum, 6).getValue();

  if (fVal == "" || isNaN(fVal)) {
    return "";    //leave cell blank if column F doesn't contain a number
  }

  var formula = '=SUM((G2*F2)+A2+B2+C2)';

  return formula;
}
^这只会使单元格显示字符串“=SUM((G2*F2)+A2+B2+C2)”

因此,我尝试在活动单元格上使用setFormula:

function myFunction3() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell = sheet.getActiveCell();
  var rowNum = cell.getRow();
  var fVal = sheet.getRange(rowNum, 6).getValue();

  if (fVal == "" || isNaN(fVal)) {
    return "";    //leave cell blank if column F doesn't contain a number
  }

  cell.setFormula('=SUM((G2*F2)+A2+B2+C2)');
}
^当我在单元格中调用函数时,返回了一个错误:“您没有调用setFormula的权限”。当我尝试获取活动单元格的a1表示法,然后使用getRange(a1Notation).setFormula('=SUM((G2*F2)+A2+B2+C2'),而不是直接在活动单元格上调用setFormula时,也发生了同样的情况


有人知道有没有办法绕过那个权限错误吗?或者对如何实现这一点有其他想法吗?

权限错误是因为用户定义函数的功能受到限制。但是,您可以使用onEdit这样做:

function onEdit(e) {
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getActiveSheet();
var col = e.range.getColumn();
var rowNum = e.range.getRow();
if(col==6){
  var fVal = s.getRange(rowNum,col,1, 1).getValue()
 }
     if (fVal == "" || isNaN(fVal)) {
       return 
     }
      else{
        s.getRange(rowNum,col,1, 1).setFormula('=SUM((G2*F2)+A2+B2+C2)');
   }}

事实上,我最终找到了一种方法来实现我想使用的内置功能,所以我就是这么做的。

谢谢!我曾想过做类似的事情,但似乎太过/低效了,因为这个电子表格被编辑了很多次。使用onEdit是不是很昂贵,时间也很明智?我从来没有发现onEdit是个问题。此脚本仅限于F列。如果有多个工作表,则可以进一步将其限制为特定工作表。执行F列中的代码,然后转到脚本编辑器。从菜单中选择查看,然后选择执行记录。它将显示总运行时间。我的总运行时间为0.126秒。然后在另一列中输入一些内容。非F列时,我的运行时间为0.002秒。如果此答案解决了您的问题,请批准此答案。谢谢