在脚本中使用公式

Shu*_*a16 5 google-sheets google-apps-script

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

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

进而:

=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")))
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以通过三种方式执行这些操作。

  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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,.getValues()创建一个二维数组。如果您需要遍历列和行,则需要 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
Run Code Online (Sandbox Code Playgroud)

值得一提的是 GAS 如何处理二维数组。values[i][j]表示i有多少行和j列。你可以像这样想象:

values = [[A1, B1, C1],[A2, B2, C2],[A3, B3, C3]]

这是一个数组数组,其中外部数组是行数组,而内部是该行中按列排列的单元格值数组。


Shu*_*a16 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;

}
Run Code Online (Sandbox Code Playgroud)