如何从脚本内部与电子表格内部运行索引函数

时间:2018-11-05 15:00:56

标签: google-apps-script google-sheets

我有一个用例,我需要在代码内或电子表格单元格内运行索引函数。

用例如下:

  • 从表单中获取回复
  • 基于答案组合应用逻辑以计算每个问题的分数(这是我需要使用Index函数来查找有助于计算的表格的地方)
    • 将问题分组(A组,B组,C组等)
    • 如果对A组的答案为“ 1”,那么该组的总分将被强制为0。A组中的所有问题仍将获得单独的分数,但组分数仍为0。 li>
    • 如果对A组的回答,问题1为“是”,则总分是该组问题中获得的所有分数的平均值。

在excel VBA中,可以使用以下方法完成此操作:     Application.WorksheetFunction.Index(...,...,...)

在Google表格的Google脚本中是否存在任何此类功能? 我已经尝试过自己编写代码,尽管我可以在代码中使用它,但是我无法使其在工作表中正确返回。

function udfINDEX(str_ROW, str_COL) {
  var app = SpreadsheetApp.getActive();

  // FORM Responses are on this tab
  var form = app.getSheetByName("Form Responses");

  // Calculations are occuring on this tab
  var xlte = app.getSheetByName("Translated Responses");

  // Points value for each Question and Override logic listed on this tab
  var vals = app.getSheetByName("Values");

  var i_row = udfMATCH(str_ROW.getValue(), 'r');
  var i_col = udfMATCH(str_COL.getValue(), 'c');

  var ans = form.getRange(i_row, i_col, 1, 1)

  return String(ans).trim(); 
}

function udfMATCH(strFIND, strTYPE) {
  var app = SpreadsheetApp.getActive();
  var form = app.getSheetByName("Form Responses");

  if ( strTYPE === "r" ) {
    return udfROW(strFIND, form.getLastRow());
  } else {
    return udfCOL(strFIND, form.getLastColumn());
  } 
}

// Always a TimeStamp 
function udfROW(strFIND, iMaxRow) {
  var app = SpreadsheetApp.getActive();
  var form = app.getSheetByName("Form Responses");

  for (var i = 1; i <= iMaxRow; i++) {
      var findDTE = String(strFIND).trim()
      var compareDTE = String(form.getRange(i, 1, 1, 1).getValue()).trim();

      if ( compareDTE == findDTE ) {
        return i;
        break;
      } else if ( compareDTE.length == 0 ) {
        return NaN;
        break;
      }
  }
}


// Each Column has Unique Value or Header
function udfCOL(strFIND, iMaxCol) {
  var app = SpreadsheetApp.getActive();
  var form = app.getSheetByName("Form Responses");

  var i = 1

  for (var j = 1; j <= iMaxCol; j++) {
    var findCOL = String(strFIND).trim();
    var compareCOL = String(form.getRange(1, j, 1, 1).getValue()).trim();

    if ( compareCOL == findCOL ) {
        return j;
        break;
    } else if ( compareCOL.length == 0 ) {
        break;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试类似的方法。在我的简单示例中,它起作用。也许它将对您有用。除数组公式外,我对单元格公式不那么熟悉。

function mySum(a,b){
  var a=a || 'A1';
  var b=b || 'B1';
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var v1=sh.getRange(a).getValue();
  var v2=sh.getRange(b).getValue();
  var cell=sh.getActiveCell();
  cell.setFormula('=SUM(' + a + "," + b + ')');
  var v3=cell.getValue();
  return cell.getValue();
}