谷歌应用程序脚本:如何在UI关闭后运行此代码

Google Apps Script: How to get this code run after UI is closed?

本文关键字:运行 代码 UI 脚本 应用程序 谷歌      更新时间:2023-09-26

这可能看起来是一个非常新手的问题,但我一直被它卡住了。我用这个代码在UI中显示一个检查列表,并将一个或多个文档的段落插入另一个目标文档:

 var fact_list = [ ["Kennedy Inauguration", "politics", "tZwnNdFNkNklYc3pVUzZINUV4eUtWVWFSVEf"], ["Pericles’ Funeral Oration", "politics", "sdgrewaNkNklYc3pVUzZINUV4eUtW345ufaZ"], ["The Pleasure of Books", "culture", "1234rFszdgrfYc3pVUzZINUV4eU43usacd"], ["I Am The First Accused (Nelson Mandela)", "law", "34rsgadOsidjSZIswjadi95uydnfklsdks"] ];
    function showList() {
        var mydoc = SpreadsheetApp.getActiveSpreadsheet();
        var app = UiApp.createApplication();
        var panel = app.createVerticalPanel().setId('panel');
        // Store the number of items in the array (fact_list)
        panel.add(app.createHidden('checkbox_total', fact_list.length));
        // add 1 checkbox + 1 hidden field per item 
        for(var i = 0; i < fact_list.length; i++){
          var checkbox = app.createCheckBox().setName('checkbox_isChecked_'+i).setText(fact_list[i][0]);
          var hidden = app.createHidden('checkbox_value_'+i, fact_list[i]);
          panel.add(checkbox).add(hidden);
        }
        var handler = app.createServerHandler('submit').addCallbackElement(panel);
        panel.add(app.createButton('Submit', handler));
        app.add(panel);
        mydoc.show(app);
    }
    function submit(e){
      var numberOfItems = e.parameter.checkbox_total;
      var itemsSelected = [];
      // for each item, if it is checked / selected, add it to itemsSelected
      for(var i = 0; i < numberOfItems; i++){
        if(e.parameter['checkbox_isChecked_'+i] == 'true'){
          itemsSelected.push(e.parameter['checkbox_value_'+i]);
        }
      }
      var app = UiApp.getActiveApplication();
      ScriptProperties.setProperties({'theses': itemsSelected}, true);
      app.close();
      return app;
    }

    function importTheses(targetDocId, thesesId, thesesType) { // adapted from Serge insas
      var targetDoc = DocumentApp.openById(targetDocId);
      var targetDocParagraphs = targetDoc.getParagraphs();
      var targetDocElements = targetDocParagraphs.getNumChildren();
      var thesesDoc = DocumentApp.openById(thesesId);
      var thesesParagraphs = thesesDoc.getParagraphs();
      var thesesElements = thesesDoc.getNumChildren();
      var eltargetDoc=[];
      var elTheses=[];
      for( var j = 0; j < targetDocElements; ++j ) {
           var targetDocElement = targetDoc.getChild(j);
    //      Logger.log(j + " : " + type);// to see targetDoc's content
            eltargetDoc[j]=targetDocElement.getText();
           if(el[j]== thesesType){
               for( var k = 0; k < thesesParagraphs-1; ++k ) {
                   var thesesElement = thesesDoc.getChild(k);
                   elTheses[k] = thesesDoc.getText();
                   targetDoc.insertParagraph(j, elTheses[k]);
             }
          }
       }
    }

但是,当我在主函数中调用这些函数时,我得到了一条红色消息(用我的语言):service not available: Docs,在showList()的UI关闭后,我的代码就不会发生任何变化(但我希望主函数继续运行)。我这样称呼这些函数:

  if (theses == 1){
    showList();
    var thesesArrays = ScriptProperties.getProperty('theses');
    for (var i = 0; i < thesesArrays.lenght(); i++){
      var thesesId = ScriptProperties.getProperty('theses')[i][2];
      var thesesType = ScriptProperties.getProperty('theses')[i][1];
      importTheses(target, thesesId, thesesType);
    }
  }      
  showURL(docName, link); //  Shows document name and link in UI

那么,我该怎么解决呢?如何使代码运行到第showURL(docName, link);行?

showList();

此函数仅创建Ui。

您只在单击提交按钮时执行的服务器处理程序中设置脚本属性。此后:

    ScriptProperties.getProperty('theses');

什么都装不下。所以你需要调用这些线路:

var thesesArrays = ScriptProperties.getProperty('theses');
for (var i = 0; i < thesesArrays.lenght(); i++){
  var thesesId = ScriptProperties.getProperty('theses')[i][2];
  var thesesType = ScriptProperties.getProperty('theses')[i][1];
  importTheses(target, thesesId, thesesType);
}

在服务器处理程序中,或者将它们放在方法中,然后从服务器处理程序调用该方法。