Agregue un activador de secuencia de comandos a Google Sheet que funcionará en la aplicación móvil de Android

13

Tengo una hoja de Google que incluye un script que debe ejecutarse al hacer clic en un botón. La forma recomendada de hacer esto (por lo que puedo decir) es insertar una imagen y luego adjuntar un script a la imagen en cuestión.

Esto funciona bien siempre que abra la hoja en mi escritorio. Sin embargo, si abro la hoja en la aplicación de hoja de Android de Google, la imagen simplemente no aparece. Por lo que puedo decir, este (falta de) comportamiento no está documentado en ninguna parte, pero he encontrado a varias personas con el mismo problema.

Me preguntaba cómo eludir este problema. ¿Perdí algo obvio que hará que mis imágenes sean visibles en la aplicación de Android? ¿O hay otra forma simple de agregar un activador de script a una hoja que funcionará en dispositivos móviles?

Probaton
fuente
1
Esto es realmente un problema con la aplicación nativa Sheets para Android, ¿no? Su pregunta probablemente sea mejor para los entusiastas de Android .
ale
1
@Cerveza inglesa. Esa es una forma de verlo, pero para superar el problema uno necesita el conocimiento de Google Sheets, no el conocimiento de Android.
@Normal: por eso hice la pregunta (y no voté para cerrar). Solo intento ayudar al Asker a atraer al experto (ise) necesario para obtener una respuesta.
ale

Respuestas:

26

Parece que actualmente ni las imágenes ni los elementos de menú personalizados funcionan en la aplicación Sheets de Android. Sugiero crear un "menú de funciones" dentro de la hoja de cálculo. Por ejemplo:

  1. La celda A1 dice "Seleccionar una función"
  2. La celda B1 tiene una regla de validación de datos que restringe el contenido a los nombres de las funciones que tiene. En mi ejemplo, son "insertSomething" y "convertSomething". (No marque "mostrar ayuda" en el cuadro de diálogo de validación de datos, la ventana emergente "ayuda" es una molestia en el móvil).
  3. Una función de script onEdit(disparador simple), que se ejecuta en cada edición, verifica si el contenido de B1 ha cambiado. Si es así, ejecuta la función apropiada.

Aquí está mi código, con dos funciones incluidas con fines de demostración:

function onEdit(e) {
  if (e.range.getA1Notation() == 'B1') {
    if (/^\w+$/.test(e.value)) {        
      this[e.value]();
      e.range.clear();
    }
  }
}

function insertSomething() { 
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(2,3).setValue('inserted something');
}  

function convertSomething() { 
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(3,3).setValue('converted something');
}  

La condición /^\w+$/.test(e.value)es solo para verificar que tenemos una cadena no vacía y no estamos ejecutando código malicioso que alguien de alguna manera puso en la celda B1. Después de que la función se invoca con this[e.value]();(se thisrefiere al objeto global y contiene nombres de funciones), el contenido de B1 se borra. Uno puede elegir ejecutar la misma función nuevamente u otra.

Como prueba de concepto, aquí hay capturas de pantalla de la aplicación. Captura de pantalla 1: selección de una función

escoger

Captura de pantalla 2: después de que la función se haya ejecutado

después

Referencias

El maestro
fuente
Esta es una solución muy simple, limpia y efectiva. Bien hecho.
StephenH
Esto funciona siempre que la función que se llama no se utilice para enviar un correo electrónico. Los correos electrónicos no pueden ser activados por una escucha de edición, por lo que el problema del botón / menú personalizado es realmente limitante.
10klines
2
@ 10klines En ese caso, cambie el onEditactivador simple a uno instalable, que se ejecuta con la autorización del usuario que instaló el activador.
Si lo desea, puede usar casillas de verificación para activar funciones en lugar de imágenes o Validación de datos. Con mi tableta, la función eval no funcionó, así que configuré un montón de casillas de verificación para cada función. Ajusté el código en consecuencia y funciona bien. Sugerencia: si tiene una tableta, no use el cuadro de mensaje, no funciona por alguna razón.
Tobias Sarnow
Esta es una buena solución, sin embargo, no funciona si se llama a la función para realizar llamadas a la API y obtener la respuesta, ya que solicita la aprobación de Google. Cualquier trabajo alrededor?
JB