Mis usuarios en App Script leen su número de cola de una hoja de cálculo:
var array = sessionsSheets.getRange(row, 2, 1, 3).getValues()[0]; var questionNumber = array[2]; //This is the variable of interest, it is an integer signifying the queue sessionsSheets.getRange(`D${row}`).setFormula(questionNumber+1); //This is the updated queueLuego actualizan este número de cola como se ve arriba. Este método funciona bien la mayor parte del tiempo, pero si toma dos dispositivos y ejecuta la secuencia de comandos simultáneamente, ambos reciben la misma cola y la secuencia de comandos se detendrá para uno de ellos porque necesitará un número de cola único más adelante para usar la API de diapositivas. :
Slides.Presentations.batchUpdate({'requests': requests}, presentationId);Si las promesas funcionaran, simplemente habría puesto la línea Slides API en un bloque de prueba, y si aparece un error de duplicidad, llamaría a la misma función de forma recursiva, hasta que no se produzca la superposición. Sin embargo, las promesas no son compatibles con App Script, entonces, ¿qué debo probar en su lugar?
Encontré una solución para mi caso especial:
Usé ScriptProperties en los Servicios de propiedades en App Script. Cuando un usuario abre la aplicación, busca la propiedad de la clave con el token de su sesión. Si dice ocupado, espera e intenta recursivamente la misma función, si dice libre, lo cambia a ocupado, ejecuta sus API y, al final, lo cambia a libre nuevamente.
Fragmento de código:
function queueing(comment,name,token,sessionsSheets,row) { var properties = PropertiesService.getScriptProperties(); var state = properties.getProperty(token); if (state==null){ properties.setProperty(token , `busy@0`); posting(comment,name,token,sessionsSheets,row,0); } else if (state.includes("busy")){ Logger.log('Gotta wait my turn'); Utilities.sleep(2000); queueing(comment,name,token,sessionsSheets,row); } else if (state.includes("free")){ var questionNumber = state.split('@')[1]; properties.setProperty(token , `busy@${questionNumber}`); posting(comment,name,token,sessionsSheets,row,questionNumber); }}