在脚本中使用公式

时间:2016-08-12 13:34:23

标签: google-apps-script google-sheets

我想在自定义函数中使用公式,例如:

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")))

3 个答案:

答案 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;

}