HKRoed

Hans Kristian Røed

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;
}
				
			

Legg igjen en kommentar