🗪 Para comprobar que la música esta en todas partes. He ideado un teclado musical mediante Class Ui Method showSidebar(). Utilizado una combinación de fórmulas, Google Apps Script, JSDoc, htlm, css y JavaScript.
🗪 Para comprobar que la música esta en todas partes. He ideado un teclado musical mediante Class Ui Method showSidebar(). Utilizado una combinación de fórmulas, Google Apps Script, JSDoc, htlm, css y JavaScript.
Hoja de cálculo Google: al abrir, genera un menú, oculta la hoja «parameterFrequency» y ejecuta la función «🔃goLastCellEdited(boolean, e)» para ir a la celda que has editado por última vez.
Hoja « parameterFrequency »: Esta formada por un patrón de tres líneas. Esta hoja se oculta automáticamente en el evento onOpen(e).
Valor numérico de la frecuencia.
Valor cadena tipo de onda.
Valor cadena nombre de la nota que reproducirá el sonido.
Hojas « music » Este el nombre que debe contener si queremos duplicar o añadir. Por ejemplo el nombre la melodía « caKog: 🎶music𝓚𝓮𝔂𝓼 »
B1 Contiene un desplegable para seleccionar el nombre de la frecuencia obtenida de la hoja « parameterFrequency » El cual al seleccionar insetar los valores en A2:4
E1 Casilla de verificación. ⮽ Permite rescribir las frecuencias, tipo de onda y nombre de la nota. ☐ activa el funcionamiento del desplegable B1
G1 Valor numérico en milisegundos de la duración de las notas musicales. Por defecto 1000(ms)
H1 Valor numérico en milisegundos de la duración del silencio entre notas musicales. Por defecto 250(ms)
Rango de A2:4 parámetros modificales si E1 = ⮽
A2:2 Fila donde se ubica las frecuencias en Hz.
A3:3 Fila para establecer el tipo de onda: sine, square, sawtooth or triangle.
A4:4 Fila para nombra cada frecuencia en forma de nota.
Rango A5:7 asignación de signos acorde a los tiempos de silencio entre notas. [opcional]
A5:5 signos.
A6:6 coeficiente
A7:7 fórmula para a establecer tiempos en milisegundos .
Rango A9:lastRow espacio para escribir las notas musicales y tiempos de silencio. Para componer una melodía.
En cada celda escribe una nota. Si en la siguiente celda escribimos otra nota, el tiempo de silencio sé aplica según valor celda H1. En cada nota de cada celda puedes intercalar el singo o establecer otro valor número en milisegundos. Las celdas vacías o valores no númericos que no corresponda con las notas son ignorados.
En la barra de menús. Se muestra un menú llamado «🛠Tools»
«🎘 showSidebar» La primera vez solicita otorgar permisos. Automáticamente se crea una activador instalable. Su función es invalidar los permisos después de 30 días de inactividad de la barra lateral. finalmente se muestra la barra lateral.
Barra lateral «🎶 𝓶𝓾𝓼𝓲𝓬𝓚𝓮𝔂𝓼» incluye teclado musical según frecuencias. tiempo y notas de la hoja activa. Los demás botones
🎹 generar teclado,
🟢 stop,
🔁 reproducción continua,
🗑️ borrar teclados musicales,
🧹 borrar panel de información,
🔔suspender audio «automático 5(mm) inactividad»
✖ cerrar ventana y
ꕹ regulador de frecuencia «depende de la frecuencia hay distorsión» valor que queda almacenado.
«🆔:0 🎵:tr-frequency4-5-6 ⌛:0.42s 📄:caKog: music » Cada teclado generado contiene:
«🗗 Play ⏯» Genera los sonidos de la hoja actual desde la fila 9,
«⇱ Play ⏯» Generar los sonidos del rango o rangos seleccionados,
«🖳 Play ⏯» genera los sonidos almacenados,
«🖫» guarda las notas de la hoja actual y
«🗑» borra el teclado musical.
«⧉ Sheet copy template» Crea una copia de la hoja «template: music» que esta oculta.
«🧹 Delete music notes» Boora el contenido a partir de la fila nueve de la hoja activa si contiene el nombre «music»
«🎘 showSidebar» «⚠ authorization»🗝 Invalidate» Instertado en otro submenú para evitar clic accidentalmente. Su misión es elimiar el activador instalado y retirar los permisos manualmente similar a Google Account: Security Review: Remove access.
💡 𝐏𝐫𝐨𝐩𝐨𝐬𝐚𝐥(𝐬) & 📝 𝐃𝐞𝐭𝐚𝐢𝐥(𝐬) 𝐫𝐞𝐥𝐞𝐯𝐚𝐧𝐭:
formato condicional
=LET(getCell;INDIRECT(CONCATENATE("R";ROW();"C";COLUMN());FALSE());
getRangeShearch;SORT(TOCOL(INDIRECT("A4:7");TRUE()));
IFS(ISBLANK(getCell);FALSE(); ISNUMBER(getCell);FALSE();
NOT(ISNUMBER(MATCH(getCell;getRangeShearch;0)));TRUE()))
Resalta las celda(s) en color rojo las notas que no coincidan con le teclado musical.
⏰triggers.gs
['parameterFrequency', 'template: music']
.forEach(
/**
* ### Hidden sheets.
* @param {string} sheetName - sheet name from hidden..
*/
function (sheetName){
try{
/** @type {SpreadsheetApp.Sheet|null} Get class sheet name. */
const classSheet = classSpreadsheet.getSheetByName(sheetName);
if(classSheet){
classSheet.hideSheet();
}else{
showToast({warning: `Is not sheet name ${sheetName}`});
}; /* End if if(classSheet) */
}catch(err){throw new Error(err);};
} /* End function(sheetName) */
); /* End forEach() */
Para ocultar varias hojas utilizando el mismos codigo creamos una matriz con los nombres de las hojas a ocultar
⧉sheetCopyTemplate.gs
SpreadsheetApp.getActiveRangeList().getRanges()
.flatMap(
function(classRanges){
return classRanges.getValues();// values of each range
} /* End function(classRanges) */
).flat()
.filter(Boolean); // Excludes '', void, zero, null and undefined.
Obtenemos todos los valores de la celda(s) y rango(s) en una matriz undimensional eliminado los valores vacíos, nullos, indefinidos y ceros.
El orden de los valores según el orden de la selección.
🗄sendLogger.gs
function sendLogger(data){
try{
console.log('🗄', data || 'Is not defined');
}catch(err){showToast(err);};
}; /* End function sendLogger() */
🎶 𝓶𝓾𝓼𝓲𝓬𝓚𝓮𝔂𝓼.htlm
/* Send logger */
google.script.run.withFailureHandler(showInfo).sendLogger(
`ℹ️ ${document.title}\n` +
'ℹ️ script glogal\n' +
'ℹ️ AudioContext:\n' +
` SampleRate: ${classAudioContext.sampleRate}\n` +
' latencyHint: playback\n' +
` baseLatency: ${classAudioContext.baseLatency}\n` +
` outputLatency: ${classAudioContext.outputLatency}\n` +
` sinkId: ${classAudioContext.sinkId || 'default'}\n` +
` State: ${classAudioContext.state}`
); /* End google.script.run */
«Class google.script.run» Llamada a la API.
«withFailureHandler(showInfo)» En caso de error muestra la información en una etiqueta <label>
«sendLogger()» recibe la cadena de texto y queda registrada en el panal de ejecuciones.
🎶 𝓶𝓾𝓼𝓲𝓬𝓚𝓮𝔂𝓼.htlm
google.script.run
.withFailureHandler(showInfo)
.withSuccessHandler(generateKeys)
.getSheetValues({message: `script gobal ${document.title}`});
«Class google.script.run» Llamada a la API.
«withFailureHandler(showInfo)» En caso de error muestra la información en una etiqueta <label>
«withSuccessHandler(generateKeys)» llamada a la función que recibe valores en el archivo htm de la funcion «getSheetValues()» ubicada en el archiv gs.
«getSheetValues({message: `script gobal ${document.title}`})» llamada a la funcion en el archivo gs para enviar dados a la funcion «generateKeys» de datos y a su vez recibe datos.
🎶 𝓶𝓾𝓼𝓲𝓬𝓚𝓮𝔂𝓼.htlm
google.script.run
.withFailureHandler(showInfo)
.withSuccessHandler(
function (objValues, button){
try{
temporaryStorage[parseInt(button.name)] = objValues;
showInfo(
`🆔:${button.name} ${button.title} Save notes ` +
`📄:${objValues.sheetName}.`
);
}catch(err){showInfo(err);};
} /* End function (objValues, button) */
) /* End withSuccessHandler */
.withUserObject(this)
.getSheetValues(
{
message: document.title +
'\nℹ️ function generateKeys(objValues)\n' +
`ℹ️ ${this.tagName} ${this.title} 🆔:${this.name}`
}
); /* End getSheetValues() */
Mismo ejemplo. Diferencia en vez de llamar a la función creamos una «function (objValues, button)»
🗗sowSidebar.gs
/** @type {HtmlService.HtmlTemplate} Get class HtmlTemplate. */
const htlmTemplate = HtmlService.createTemplateFromFile(TITLE_SIDEBAR);
/* Create variable y value. */
htlmTemplate.title = TITLE_SIDEBAR;
/** @type {HtmlService.HtmlOutput} Evaluate and convert inHtmlOutput. */
const html = htlmTemplate
.evaluate()
.addMetaTag('viewport', 'width=device-width, initial-scale=1')
.setTitle(TITLE_SIDEBAR);
SpreadsheetApp.getUi().showSidebar(html);
Utilizando Class HtmlTemplate method evaluate() para evaluar errores y seguridad, a su vez creamos una variable «title» para utilizar en el archivo htlm <title><?= title ?></title>
📷 𝐑𝐞𝐬𝐮𝐥𝐭(𝐬):
📺𝐃𝐞𝐦𝐨𝐧𝐬𝐭𝐫𝐚𝐭𝐢𝐨𝐧(𝐬):
💾 𝐆𝐨𝐨𝐠𝐥𝐞 𝐒𝐩𝐫𝐞𝐚𝐝𝐬𝐡𝐞𝐞𝐭(𝐬):
🌍 𝐆𝐨𝐨𝐠𝐥𝐞 𝐒𝐢𝐭𝐞(𝐬):