У меня есть сценарий использования, когда мне нужно запустить функцию индекса из кода по сравнению с ячейкой электронной таблицы.
Вариант использования следующий:
- Получите ответы из формы
- Применение логики на основе комбинации ответов для расчета баллов по каждому вопросу (здесь мне нужно использовать функцию индекса для поиска таблицы, которая помогает с вычислениями)
- Вопросы сгруппированы (Группа 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;
}
}
}