在 App 脚本中为幻灯片排队用户 API 批量更新

Queuing users for Slides API Batch Update in App Script

我在 App Script 中的用户从电子表格中读取他们的队列号:

    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 queue

然后他们会更新此队列编号,如上所示。这种方法在大多数情况下都可以正常工作,但是如果您同时使用两个设备和 运行 脚本,它们都会收到相同的队列,并且脚本将停止其中一个,因为稍后您需要一个唯一的队列号使用幻灯片 API:

    Slides.Presentations.batchUpdate({'requests': requests}, presentationId);

如果 promises 有效,我会简单地将 Slides API 行放在一个 try 块中,如果出现口是心非的错误,我会递归调用相同的函数,直到重叠不存在为止'不会发生。但是,App 脚本不支持 promises,所以我应该尝试什么?

我找到了针对我的特殊情况的修复方法:

我在 App Script 的属性服务中使用了 ScriptProperties。当用户打开应用程序时,他会使用会话令牌查找密钥的 属性。如果它说忙,他等待并递归地尝试相同的功能,如果它说空闲,他将其更改为忙碌,执行他的 API,然后最后再次将其更改为空闲。

代码片段:

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);
}}