我想在自定义函数中使用公式,例如:
function myFunction(range, value) {
var countNumber = COUNTIF(range; value); // COUNTIF is a formula that can be used in the spreadsheet
if (countNumber > 0) {
return "RESULT";
} else {
return "OTHER RESULT";
}
}
然后:
=MYFUNCTION(A1:A5,"VALUETOTEST")
我想简化一个庞大的公式:
类似的东西:
=IF(SUM(COUNTIFS(G182:G186;"ERROR";H182:H186;"62");COUNTIFS(G182:G186;"ERROR";H182:H186;"ALL"))>0;"ERRO";IF(SUM(COUNTIFS(G182:G186;"RETEST";H182:H186;"62");COUNTIFS(G182:G186;"RETEST";H182:H186;"TODOS"))>0;"RETEST";IF(COUNTIF(G182:G186;"UNIMPLEMENTED")>0;"UNIMPLEMENTED";"SOLVED")))
答案 0 :(得分:2)
您有三种方法可以执行这些操作。
1)在您需要的范围内将图纸公式添加到图纸本身。然后使用GAS函数从结果单元格(无论您将其设置为写入的位置)读取数据。然后,您可以使用结果执行进一步处理。
2)使用GAS功能将图纸公式写入工作表。然后使用更多GAS来读取结果并处理数据。可以在此处找到此方法:https://developers.google.com/apps-script/reference/spreadsheet/range#setFormula(String)
3)您可以使用GAS创建自定义图纸公式,然后在工作表中使用。然后,GAS可以读取该结果并处理该信息。这将需要对JS作为一个整体进行一些研究,以了解如何重新创建,组合和执行您需要工作表中的数据执行的操作。
您可以在此处找到制作自定义公式的指南:https://developers.google.com/apps-script/guides/sheets/functions
这里的JS指南:http://www.w3schools.com/js/default.asp
W3 Schools对JS有一个非常全面的指南。 GAS使用所有本机JS方法,因为它是一个JS编码环境。有关可能执行所需操作的GAS特定方法的更多信息,请查看GAS参考。
如果您需要检查条件和/或遍历行,请尝试以下方法:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getRange(startRow, startColumn, numRows, numColumns);
var values = range.getValues(); //This is a 2D array; iterate appropriately
for (i = 0; i < values.length; i++) {
if (values[i] == conditionToCheck) {
//perform code..OR
//continue; <- This works to skip the row if the condition is met
} else {
//perform alternate code if condition is not met
}
}
}
正如我所提到的,.getValues()
创建了一个2D数组。如果需要遍历列和行,则需要2个for()
循环,如下所示:
for (i = 0; i < values.length; i++) { //iterates through the rows
for(j = 0; j < values[i].length; j++) { //iterates through the columns in that current row
重要的是要提到GAS如何处理2D阵列。 values[i][j]
表示有i
行和j
列。你可以像这样形象化:
values = [[A1, B1, C1],[A2, B2, C2],[A3, B3, C3]]
这是一个数组数组,其中外部数组是行的数组,而内部是该行中列的单元格值数组。
答案 1 :(得分:1)
Google Apps脚本中的自定义功能无法访问电子表格功能。您可以尝试使用此<div id="container">
<a class="page-scroll" href="#red ">
<div class="red">
<p>=FIRST-</p>
</div>
</a>
<a class="page-scroll" href="#orange">
<div class="orange">
<p>--SECOND--</p>
</div>
</a>
<a class="page-scroll" href="#blue">
<div class="blue">
<p>--- THIRDBOX ---</p>
</div>
</a>
</div>
如果结果有一个庞大的公式,请尝试为结果创建函数
=IF(COUNTIF(A1:A5,"VALUETOTEST")>0,"RESULT","OTHER RESULT")
然后使用此function result1() {
return "RESULT";
}
function result2() {
return "OTHER RESULT";
}
尝试此操作 - 在应用脚本中复制以下功能,并将其用作公式=IF(COUNTIF(A1:A5,"VALUETOTEST")>0,RESULT1(),RESULT2())
记住,以使用“=myFunction("G182:G186","H182:H186")
”包含范围,因为您将范围作为字符串传递,并注意两者范围必须相等。
"
答案 2 :(得分:0)
这就是我解决问题的方法。我感谢那些帮助我达到这个结果的人!
// Like COUNTIFS
var countConditionals = function(cells, condition1, condition2) {
var count = 0;
for (i = 0; i < cells.length; i++) {
if (cells[i][0] == condition1 && cells[i][1] == condition2) {
count++;
}
}
return count;
}
// Like COUNTIF
var countConditional = function(cells, condition) {
var count = 0;
for (i = 0; i < cells.length; i++) {
if (cells[i][0] == condition) {
count++;
}
}
return count;
}
//Whole Formula
function verificaStatus(cells, db) {
const ERROR = "ERROR";
const ALL = "ALL";
const RETEST = "RETEST";
const NOTYET = "UNIMPLEMENTADED";
const SOLVED = "SOLVED";
var countErrors = countConditionals(cells, ERROR, db);
var countErrorsAll = countConditionals(cells, ERROR, ALL);
var sumErrors = countErrors + countErrorsAll;
if (sumErrors > 0) {
return ERROR;
} else {
var retest = countConditionals(cells, RETEST, db);
var retestAll = countConditionals(cells, RETEST, db);
var sumRetest = retest + retestAll;
if (sumRetest > 0) {
return RETEST;
} else {
var countNonCreated = countConditional(cells, NOTYET);
if (countNonCreated > 0) {
return NOTYET;
}
}
}
return SOLVED;
}