usar sheets porcentaje hojas hoja google funcion formato ejemplos definicion condicional como caracteristicas calculo google-sheets google-search-api

google-sheets - sheets - hojas de calculo google ejemplos



Hash de un texto de celda en la hoja de cálculo de Google (8)

¿Cómo puedo calcular un hash MD5 o SHA1 de texto en una celda específica y establecerlo en otra celda en la hoja de cálculo de Google?

¿Hay una fórmula como =ComputeMD5(A1) o =ComputeSHA1(A1) ?

¿O es posible escribir una fórmula personalizada para esto? ¿Cómo?


Abra Tools > Script Editor luego pegue el siguiente código:

function MD5 (input) { var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input); var txtHash = ''''; for (i = 0; i < rawHash.length; i++) { var hashVal = rawHash[i]; if (hashVal < 0) { hashVal += 256; } if (hashVal.toString(16).length == 1) { txtHash += ''0''; } txtHash += hashVal.toString(16); } return txtHash; }

Guarde el script después de eso y luego use la MD5() en su hoja de cálculo mientras hace referencia a una celda.

Este script se basa en la función Utilities.computeDigest() .


Basado en @gabhubert pero utilizando operaciones de matriz para obtener la representación hexadecimal

function sha(str){ return Utilities .computeDigest(Utilities.DigestAlgorithm.SHA_1, str) // string to digested array of integers .map(function(val) {return val<0? val+256 : val}) // correct the offset .map(function(val) {return ("00" + val.toString(16)).slice(-2)}) // add padding and enconde .join(''''); // join in a single string }


Estaba buscando una opción que proporcionara un resultado más corto. ¿Qué piensas sobre esto? Solo devuelve 4 caracteres. La parte desafortunada es que utiliza i''s y o''s que pueden confundirse con L''s y 0''s respectivamente; Con la fuente correcta y en mayúsculas no importaría mucho.

function getShortMD5Hash(input) { var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input); var txtHash = ''''; for (j = 0; j < 16; j += 8) { hashVal = (rawHash[j] + rawHash[j+1] + rawHash[j+2] + rawHash[j+3]) ^ (rawHash[j+4] + rawHash[j+5] + rawHash[j+6] + rawHash[j+7]) if (hashVal < 0) hashVal += 1024; if (hashVal.toString(36).length == 1) txtHash += "0"; txtHash += hashVal.toString(36); } return txtHash.toUpperCase(); }


Gracias a Gabhubert por el código.

Esta es la versión SHA1 de ese código (cambio muy simple)

function GetSHA1(input) { var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_1, input); var txtHash = ''''; for (j = 0; j <rawHash.length; j++) { var hashVal = rawHash[j]; if (hashVal < 0) hashVal += 256; if (hashVal.toString(16).length == 1) txtHash += "0"; txtHash += hashVal.toString(16); } return txtHash; }


La diferencia entre esta solución y las otras es:

1) Corrige un problema que algunas de las soluciones anteriores tienen al compensar la salida de Utilities.computeDigest (se compensa con 128 en lugar de 256)

2) Corrige un problema que hace que algunas otras soluciones produzcan el mismo hash para diferentes entradas llamando a JSON.stringify() en la input antes de pasarlo a Utilities.computeDigest()

function MD5(input) { var result = ""; var byteArray = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, JSON.stringify(input)); for (i=0; i < byteArray.length; i++) { result += (byteArray[i] + 128).toString(16) + "-"; } result = result.substring(result, result.length - 1); // remove trailing dash return result; }


Ok lo tengo,

Debe crear una función personalizada como se explica en http://code.google.com/googleapps/appsscript/articles/custom_function.html

Y luego use las apis como se explica en http://code.google.com/googleapps/appsscript/service_utilities.html

Necesito escribir manualmente el nombre completo de la función para poder ver el resultado en la celda.

A continuación se muestra un ejemplo del código que proporcionó el hash codificado en base 64 del texto

function getBase64EncodedMD5(text) { return Utilities.base64Encode( Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, text)); }


Usando la respuesta de @gabhubert, puedes hacer esto, si quieres obtener los resultados de una fila completa. Desde el editor de guiones.

function GetMD5Hash(value) { var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, value); var txtHash = ''''; for (j = 0; j <rawHash.length; j++) { var hashVal = rawHash[j]; if (hashVal < 0) hashVal += 256; if (hashVal.toString(16).length == 1) txtHash += "0"; txtHash += hashVal.toString(16); } return txtHash; } function straightToText() { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheets(); var r = 1; var n_rows = 9999; var n_cols = 1; var column = 1; var sheet = ss[0].getRange(r, column, n_rows, ncols).getValues(); // get first sheet, a1:a9999 var results = []; for (var i = 0; i < sheet.length; i++) { var hashmd5= GetMD5Hash(sheet[i][0]); results.push(hashmd5); } var dest_col = 3; for (var j = 0; j < results.length; j++) { var row = j+1; ss[0].getRange(row, dest_col).setValue(results[j]); // write output to c1:c9999 as text } }

Y luego, desde el menú Ejecutar, simplemente ejecute la función straightToText () para que pueda obtener su resultado, y evite demasiadas llamadas a un error de función.


para obtener hashes para un rango de celdas, agregue esto junto a la función de gabhubert:

function RangeGetMD5Hash(input) { if (input.map) { // Test whether input is an array. return input.map(GetMD5Hash); // Recurse over array if so. } else { return GetMD5Hash(input) } }

y usarlo en la celda de esta manera:

=RangeGetMD5Hash(A5:X25)

Devuelve el rango de las mismas dimensiones que la fuente, los valores se propagarán hacia abajo y desde la celda con fórmulas.

Es una función universal de valor único para el método de conversión de rango-función ( ref ), y es mucho más rápida que las fórmulas separadas para cada celda; de esta forma, también funciona para una sola celda, por lo que tal vez vale la pena reescribir la función de origen de esta manera.