谷歌api脚本运行缓慢

时间:2012-06-26 10:23:36

标签: google-apps-script

我的脚本运行速度非常慢,并且在15个小步点触发器上总是超时。它基本上是Google用于在门户网站中显示驱动器文件夹内容的示例脚本(https://developers.google.com/apps-script/articles/embedding_docslist_in_sites),但在开头有一点,以便它只在办公时间运行,如果有新文件则发送电子邮件。驱动器中只有10-15个最大文件,所以不应该花太长时间。

我这样做是因为我们的传真机将传入的传真保存到服务器上的文件夹中,然后我将其与Google云端硬盘同步,我希望在组织内共享该传真并发送提醒电子邮件。

我输入了一些记录器条目,显示每个循环结束时的时间,它从每循环30秒到2-3分钟不等。 任何想法

function officeHours(){
var nowH=new Date().getHours();
var nowD=new Date().getDay();
if(nowH>18||nowH<8||nowD==6||nowD==0){return}{ 
  var done = false; 
  var emaillist = "chris@ringtail.co.uk";
  var myDate=new Date();
  myDate.setMinutes(myDate.getMinutes()-15); 
  while(!done){
    try{
      var files = DocsList.getFolderById("0Byg20FZrPmcHUUhlOGVrZlRuM28").getFiles();     
      var page = SitesApp.getPageByUrl("https://sites.google.com/a/ringtail.co.uk/portal/fax-list");     
      var listItems = page.getListItems();     
      for(a in listItems){       
        listItems[a].deleteListItem();     
      }     
      for(i in files){     
        var title = "<a href=\'"+files[i].getUrl()+"\'>"+ files[i].getName() +"</a>";     
        var lastUpdatedinctime = files[i].getLastUpdated();     
        if (lastUpdatedinctime > myDate){
          MailApp.sendEmail(emaillist, "New Fax", "",{htmlBody:"<br/><br/>A new fax has arrived<br/><br/><a href='"+files[i].getUrl()+"'>Click to view</a><br/><br/><a href='https://sites.google.com/a/ringtail.co.uk/portal/fax-list'>Click to see full fax list"});
        }
        page.addListItem([title, files[i].getType(), Utilities.formatDate(files[i].getLastUpdated(), "GMT", "yyyy-MM-dd")]);
      }    
      done = true;    
    }     
    catch(e){ 
    } 
  }
 }
}

2 个答案:

答案 0 :(得分:1)

我看到你把整个代码放在了while循环中。 您有可能遇到异常而while循环永远不会结束。您是否尝试过记录异常?如果是这样,你有没有看到任何例外被抛出?

此外,还有多个对getType(),getUrl()和getLastUpdated()的调用。如果您在第一次使用它们时将这些值缓存在局部变量中,那么您的脚本将运行得更快。虽然说无休止的while循环看起来是超时的原因。

答案 1 :(得分:0)

我发现这非常有趣并且Srik建议非常有针对性,所以我尝试了一下,使用电子表格作为“存储设备”并在几秒钟内执行;-) 我在项目下方显示您应该使用正确的网址和列设置重新修改以满足您的需求。 (我添加了一些评论以明确(希望))

    function officeHours(){
      var sh = SpreadsheetApp.getActiveSheet();
      var emaillist = "email@gmail.com";
          var files = DocsList.getFolderById("xxxxxxxxxxxxxxxxxxxxxxx").getFiles();  
          var page = SitesApp.getPageByUrl("https://sites.google.com/site/appsscriptexperiments/home/xxxxxxxx");     
          var listItems = page.getListItems();  
          Logger.log(listItems.length+"  =?  "+files.length )
          var siteList=new Array();
      for(a in listItems){ 
    //        Logger.log(listItems[a].getLastUpdated())
      siteList.push([listItems[a].getLastUpdated(),listItems[a].getValueByIndex(3)]);// choose what you save on the sheet  
          }     
      sh.getRange(1,1).setValue('Site List')  
      sh.getRange(2,1,siteList.length,siteList[0].length).setValues(siteList)

// ***************************************
        if(listItems.length<files.length){;// new file added in doc list , that is the main condition !!!
// ***************************************
          var fileList=new Array()
                for(var n in files){
                  fileList.push([files[n].getLastUpdated(),files[n].getName(),files[n].getId()]);// choose what you save on the sheet
                    }
          Logger.log(n) ;// n is the last index
      fileList.sort(function(x,y){
      var xp = x[0];// choose on which item to sort so that the last item is the last added to the folder
      var yp = y[0];
      return xp == yp ? 0 : xp < yp ? -1 : 1;// sort mode
    });
      sh.getRange(1,3).setValue('File List')  
      sh.getRange(2,3,fileList.length,fileList[0].length).setValues(fileList)
     //       MailApp.sendEmail(emaillist, "New Fax", "",{htmlBody:"<br/><br/>A new fax has arrived<br/><br/><a href='"+fileList[n][2]+"'>Click to view</a><br/><br/><a href='https://sites.google.com/a/ringtail.co.uk/portal/fax-list'>Click to see full fax list"});
            page.addListItem([fileList[n][0],'new',fileList[n][1],"<a href=\'"+fileList[n][2]+"\'>"+fileList[n][0]+"</a>"]);
                }   
       }    

请注意,我在此测试中删除了“计时器技巧”,您应该按原样添加它。(很高兴看到它为您服务; - )