Skip to content

Instantly share code, notes, and snippets.

@pfelipm
Last active March 16, 2021 18:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pfelipm/2c02e8d955e84e9d4b235d56ac6deaa0 to your computer and use it in GitHub Desktop.
Save pfelipm/2c02e8d955e84e9d4b235d56ac6deaa0 to your computer and use it in GitHub Desktop.
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