2017-08-11 75 views
1

我在Google Apps脚本中编写自定义函数,如果某个其他单元格包含数字,则使用该单元格的值和其他几个单元格计算结果。否则,如果某个其他单元格不包含数字,则函数应该只返回一个空字符串,以使活动单元格显示为空白。
我能够想出一个工作函数来做到这一点,但为了保护敏感信息,我不打算在这里复制它。相反,下面是完成同样的事情为例功能:Google Apps脚本 - 根据另一个单元格的值设置活动单元格的公式

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时,活动细胞。

有人知道是否有解决权限错误的方法吗?或者有什么其他想法来解决这个问题?

回答

0

其实我最终想办法来完成我想要使用内置IF function,所以这就是我所做的。

1

权限错误是由于用户定义函数可以执行的限制。你可以,但是,与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)'); 
    }} 
+0

谢谢!我想过做这样的事情,但是由于这个电子表格被编辑了很多,所以它看起来过度/效率低下。昂贵的时间使用onEdit? – LJW

+0

我从来没有发现onEdit是一个问题。该脚本仅限于F列。如果您有多个工作表,您可以进一步将其限制为特定工作表。执行F列中的代码,然后转到脚本编辑器。从菜单中选择查看并选择执行抄本。它会显示总运行时间。我的总运行时间为0.126秒。然后在另一列输入内容。当不是列F时,我的运行时间是0.002秒。如果此答案解决了您的问题,请批准答案。谢谢。 –

相关问题