2017-06-30 23 views
0

我有這個腳本來刪除我的Google雲端硬盤中的所有._*文件。但有數百萬個文件,並且在「超出最大執行時間」5分鐘左右之後,腳本就會退出。如何擴展腳本執行時間? (Google Script)

function TrashDotFiles() { 
    var files = DriveApp.getFiles(); 
    while (files.hasNext()) { 
    var file = files.next(); 
    var name = file.getName(); 
    if (name.indexOf("._")==0) { 
     console.log(name + " • trashed"); 
     file.setTrashed(true) 
    } 
    } 
} 

如何讓此腳本運行足夠長的時間以掃描整個驅動器?

+0

搜索類似的問題。你不能延長時間,但可以通過使用觸發器的部分來處理它。 –

回答

2

一個可能的解決方法是運行在模式窗口普通的JavaScript代碼,沒有運行時間限制:

function onOpen() 
{ 
    var ui = SpreadsheetApp.getUi(); 

    ui.createMenu('Trash dot files') 
     .addItem('Run', 'openWindow') 
     .addToUi(); 
} 

function openWindow() 
{ 
    var ui = SpreadsheetApp.getUi(); 

    // get template 
    var template = HtmlService.createTemplateFromFile('deleteDriveFiles'); 

    // need to have next line of text somewhere (even commented out) to trigger correct scopes for script and token: 
    // DriveApp.getFiles() 

    // pass token 
    template.data = { 
    token: ScriptApp.getOAuthToken() 
    }; 

    // get output html 
    var html = template.evaluate(); 

    // show modal window 
    ui.showModalDialog(html, 'Delete files from Drive'); 
} 

[文件 - 新建 - HTML文件] deleteDriveFiles.html:

<!DOCTYPE html> 
<html> 
    <head> 
    <base target="_top"> 
    </head> 
    <body> 
    <script> 

    // used for visual log 
    function addParagraph(text) 
    { 
    var node = document.createElement('p'); 
    node.innerText = text; 
    document.body.appendChild(node); 
    } 

    // for stats 
    var totalProcessed = 0; 
    var totalTrashed = 0; 

    function reqListener(){ 
    // get response obj 
    var res = JSON.parse(this.responseText); 

    if (res.items && res.items.length) 
    { 
     // loop files 
     for (var i = 0; i < res.items.length; i++) 
     { 
     var file = res.items[i]; 

     // delete file 
     if (file.title.indexOf('._') == 0) 
     { 
      var xhr = new XMLHttpRequest(); 
      xhr.addEventListener('load', function(){ 
      // get response obj 
      var res = JSON.parse(this.responseText); 

      // sucessfully trashed 
      if (this.status == 200) 
      { 
       totalTrashed++; 
       addParagraph('Trashed '+res.title); 
      } 
      }.bind(xhr)); 
      xhr.open('POST', 'https://www.googleapis.com/drive/v2/files/'+file.id+'/trash'); 
      xhr.setRequestHeader('Authorization', 'Bearer <?=data.token?>'); 
      xhr.send(); 
     } 
     } 

     // for stats 
     totalProcessed += res.items.length; 
    } 

    // get next page of results 
    if (res.nextPageToken) 
    { 
     var xhr = new XMLHttpRequest(); 
     xhr.addEventListener('load', reqListener); 
     xhr.open('GET', 'https://www.googleapis.com/drive/v2/files?trashed=false&pageToken='+res.nextPageToken); 
     xhr.setRequestHeader('Authorization', 'Bearer <?=data.token?>'); 
     xhr.send(); 
    } 
    // finished 
    else 
    { 
     addParagraph('Finished. Processed total: '+totalProcessed+'. Trashed total: '+totalTrashed); 
    } 
    } 

    var xhr = new XMLHttpRequest(); 
    xhr.addEventListener('load', reqListener); 
    xhr.open('GET', 'https://www.googleapis.com/drive/v2/files?trashed=false'); 
    xhr.setRequestHeader('Authorization', 'Bearer <?=data.token?>'); 
    xhr.send(); 

    </script> 
    </body> 
</html> 

節省代碼和清新的電子表格的網頁更改後,你會看到新的菜單項:

enter image description here

點擊運行開始處理文件。

結果:

enter image description here

+0

其實......它可以工作......但只檢查100個文件。我想我需要以某種方式授權API? –

+0

是的,它檢查100個文件,然後檢查100個文件,直到Drive API返回'nextPageToken'。在最終消息中,將會有處理文件的總數:「已完成,已處理總數:3377.已刪除總數:2」 – Kos

+0

這不是爲我做的;它停在100之後。總是「已處理的總數:100」 –

相關問題