Dynamiske datavalideringslister

Bruke 2 stk datavalideringslister i Google Sheets, der liste nr 2 velges ut ifra hva som blir valgt i liste nr 1

function onEdit(e) {

        //SpreadsheetApp.getActive()

        var sh = e.source.getActiveSheet(),
        allValues, list,
        
        /* easy to change' variables */        
        sheet = 'NavnPåArk',
        sheetWithLists = 'NavnPåArkMedLister',
        rangeWithLists = 'C1:G10', //Område med lister, der første rad er overskriftene (liste 1)        
        colValidation = 2, //1=A, 2=B... Kolonnen med første liste
        secondValidationOffset = 1; //forskyvningskolonner mot høyre til neste kolonne med lste
    
    /*check conditions*/    if (sh.getName() !== sheet || e.range.columnStart !== colValidation || e.range.rowStart < 2 || typeof e.value == 'object') return;
    
    /*get all values from the sheet with the lists (cached after the first run)*/    allValues = getFromCache_(sheetWithLists, rangeWithLists)
    
    /*get the correct list(column) and remove the header*/    list = allValues.map(function (v, i) {
        return v[allValues[0].indexOf(e.value)]
    }).splice(1);
    
    /*set the validation in offset column*/    e.range.offset(0, secondValidationOffset)
        .setDataValidation(SpreadsheetApp.newDataValidation()
            .requireValueInList(list)
            .build());
}

function getFromCache_(sheetName, range) {

    var key = 'DE_' + sheetName,
        c = CacheService.getPublicCache(),
        d,
        t = c.get(key);
    if (t) {
        d = JSON.parse(t);
    } else {
        d = SpreadsheetApp.getActiveSpreadsheet()
            .getSheetByName(sheetName)
            .getDataRange()
            .getValues();
        c.put(key, JSON.stringify(d));
    }
    return d;
}

Gå til neste ledige rad etter åpning

Etter åpning av en Google Sheets-arbeidsbok, så settes aktiv celle i neste ledige rad i et valgt ark

function onOpen() {
    var sheet = SpreadsheetApp.getActive()
        .getSheetByName('NavnPåArk'),
        lr;
    var val = sheet.getRange('C:C') // Kolonne for sjekk etter neste ledig
        .getValues();
    for (var i = 0, vLen = val.length; i < vLen; i++) {
        if (!val[i][0] && i > 2) {
            lr = i + 1;
            break;
        }
    }
    sheet.setActiveRange(sheet.getRange('C' + lr)) //Ønsket kolonne for celle skal bli aktiv
}