Last active
March 16, 2021 18:03
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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