Skip to content

Instantly share code, notes, and snippets.

@pfelipm
Last active Mar 16, 2021
Embed
What would you like to do?
Una fx personalizada (ESPROTEGIDA) para hdc de Google que determina si una celda está afectada por una regla de protección.
/**
* Determina si la celda indicada está protegida (no es editable por el usuario)
* @param {A1} celda Referencia a celda en formato A1 o R1C1 entre comillas dobles ("..")
* @returns VERDADERO | FALSO
* @customfunction
*
* MIT License
* Copyright (c) 2020 Pablo Felip Monferrer(@pfelipm)
*
* @OnlyCurrentDoc
*/
function ESPROTEGIDA(celda) {
if (typeof celda == 'undefined') throw ('Se esperaba una referencia a celda.');
if (celda.map) {throw ('El rango debe comprender una sola celda.');}
try {
var rango = SpreadsheetApp.getActiveSheet().getRange(celda);
var f = rango.getRow();
var c = rango.getColumn();
var hoja = rango.getSheet().getSheetName();
var hojasProtegidas = SpreadsheetApp.getActiveSpreadsheet().getProtections(SpreadsheetApp.ProtectionType.SHEET);
// ¿Está la hoja actual protegida?
var protegida = hojasProtegidas.filter(h => {return h.getRange().getSheet().getSheetName() == hoja;});
// Si la hoja de la celda está protegida, comprobar si celda es una excepción
if (protegida.length > 0) {
if (protegida[0].getUnprotectedRanges().some(r => rangoDentroDe(f, c, r)) == false) {return true;}
else {
// No podemos concluir aún que no está protegida, podría verse afectada por una regla de rango.
}
}
// Veamos ahora si celda está en alguno de los rangos protegidos
return SpreadsheetApp.getActiveSpreadsheet().getProtections(SpreadsheetApp.ProtectionType.RANGE)
.filter(r => {return r.getRange().getSheet().getSheetName() == hoja;})
.some(r => rangoDentroDe(f, c, r.getRange()));
}
catch(e) {throw ('Rango incorrecto ¿Has usado ".."?');}
}
function rangoDentroDe(f, c, r) {
// Devuelve true si la celda en (f,c) está dentro del rango representado por el objeto r
return f >= r.getRow() && f < r.getRow() + r.getNumRows() && c >= r.getColumn() && c < r.getColumn() + r.getNumColumns();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment