0

このスクリプトは非常にゆっくりと実行され、15 分トリガーで常にタイムアウトします。これは基本的に、ポータル サイト (https://developers.google.com/apps-script/articles/embedding_docslist_in_sites) でドライブ フォルダーの内容を表示するために Google が持っているサンプル スクリプトですが、最初に少し追加して、実際には営業時間中にのみ実行され、新しいファイルがある場合に電子メールを送信します。ドライブには最大 10 ~ 15 個のファイルしかないので、それほど時間はかかりません。

これを行っているのは、FAX 機が受信した FAX をサーバー上のフォルダーに保存し、それを 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の提案を見つけたので、スプレッドシートを「ストレージデバイス」として使用して試してみると、数秒で実行されます;-)プロジェクトの下に、自分のプロジェクトに合わせて再変更する必要があることを示します適切な URL と列の設定が必要です。(明確にするためにいくつかのコメントを追加しました(うまくいけば))

    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 に答える