Попробуйте это:
Это создает ассоциативный массив между именами в первом столбце и номерами строк и между заголовками столбцов и номерами столбцов.
function testIntersection(){
var r='Ken';
var c='Dec18';
Logger.log(intersection(r,c));
}
function intersection(r,c){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet18');
var rg=sh.getDataRange();
var vA=rg.getValues();
var colObj={};
var rowObj={};
for(var i=0;i<vA.length;i++){
if(i==0){
for(var j=0;j<vA[0].length;j++){
if(vA[i][j] && !colObj.hasOwnProperty(vA[i][j])){
colObj[vA[i][j]]=j+1;
}
}
}
if(vA[i][0] && !rowObj.hasOwnProperty(vA[i][0])){
rowObj[vA[i][0]]=i+1;
}
}
return sh.getRange(rowObj[r],colObj[c]).getValue();
}
Убедитесь, что верхний ряд заголовков столбцов отформатирован в виде простого текста.В противном случае они могут интерпретироваться как даты в автоматическом режиме, и нет функции getRange (string, class).
Это всего лишь некоторый код, с которым я играл, чтобы протестировать вышеуказанную функцию.Использует стол, похожий на ваш.Он генерирует немодальный диалог со всеми перечисленными возможными пересечениями.
function playingWithIntersection(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet18');
var rg1=sh.getRange(1,2,1,sh.getLastColumn()-1);
var rg2=sh.getRange(2,1,sh.getLastRow()-1,1);
var ckeys=rg1.getValues();
var rkeys=rg2.getValues();
var colkeys=[];
var rowkeys=[];
for(var i=0;i<ckeys[0].length;i++){
colkeys.push(ckeys[0][i]);
}
for(var i=0;i<rkeys.length;i++){
rowkeys.push(rkeys[i][0]);
}
var hl='<style>th,td{border:1px solid #000;}</style><table><th>rowkeys</th><th>colkeys</th><th>Value</th><tr></tr>';
for(var i=0;i<rowkeys.length;i++){
for(var j=0;j<colkeys.length;j++){
hl+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>', rowkeys[i], colkeys[j], intersection(rowkeys[i],colkeys[j]));
}
}
hl+='</table>';
var ui=HtmlService.createHtmlOutput(hl);
SpreadsheetApp.getUi().showModelessDialog(ui, 'Intersections')
}