0

我有这个脚本运行非常缓慢,并且总是在其 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){ 
    } 
  }
 }
}
4

2 回答 2

1

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

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

于 2012-06-26T10:40:50.787 回答
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>"]);
                }   
       }    

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

于 2012-06-26T21:17:48.890 回答