2013-12-13 183 views
0

这可能看起来是一个非常新手的问题,但我坚持不懈。我有了这个代码显示在UI的检查清单,并插入一个或多个文档的段落到另一个目标文件:Google Apps脚本:如何在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);

回答

1
showList(); 

这个函数创建唯一的用户界面,

你只是在执行上提交按钮的单击服务器处理器中设置的脚本属性。从那时起,

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

}
服务器处理器中或把他们的方法中并调用从服务器处理的方法。

快乐编码:)

+0

嗨,@Bharathi,谢谢你的回答。我尝试了这个建议。现在我运行了最后一行代码'showURL(docName,link);'。但是当'showList()'函数开始运行时,它会在几秒内打开和关闭用户界面,而不需要处理函数'submit(e)'。对发生什么事情有所了解? – craftApprentice

+0

把'return'放在'return showList();'解决了! =) – craftApprentice

+0

嗨,@Bharathi,'showList()'调用后面的行没有被执行。我会开始其他问题。 – craftApprentice