Как запустить функцию индекса из скрипта или внутри таблицы - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть сценарий использования, когда мне нужно запустить функцию индекса из кода по сравнению с ячейкой электронной таблицы.

Вариант использования следующий:

  • Получите ответы из формы
  • Применение логики на основе комбинации ответов для расчета баллов по каждому вопросу (здесь мне нужно использовать функцию индекса для поиска таблицы, которая помогает с вычислениями)
    • Вопросы сгруппированы (Группа A, Группа B, Группа C и т. Д.)
    • Если в ответе на вопрос группы А задан вопрос 1 «Нет», то общий балл для этой группы будет установлен на 0. Все вопросы в группе А будут по-прежнему получать отдельный балл, но балл для группы по-прежнему равен 0.
    • Если в ответе на вопрос группы А на вопрос 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 голосов
/ 05 ноября 2018

Вы можете попробовать что-то вроде этого. Это сработало в моем простом примере. Возможно, это будет работать у вас. Я не очень знаком с формулами ячеек, за исключением формул массива.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...