Sök…


Introduktion

Detta enkla Google App-webbskript (fristående) gör det möjligt att repetera Google Drive för att filer ska laddas ner till användarens lokala PC. Visar hur man använder ett appskript för att ge funktionen för båda: 1. Användargränssnitt (ett enkelt i det här exemplet) 2. Nedladdningssidan för fil. För en mer detaljerad förklaring av hur det fungerar läs exemplet "Hur det fungerar".

Anmärkningar

Webskriptet måste publiceras för att det ska fungera.

Pops-ups måste vara aktiverade för https://script.google.com

Forms.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
    
    setInterval(
    function () 
    { 
      document.getElementById('messages').innerHTML = 'Event Timer Fetching';
      google.script.run
        .withSuccessHandler(onSuccess)
        .withFailureHandler(onFailure)
        .fetchFromGoogleDrive();
    }, 60000);
    
    function callFetchGoogleDrive() {
      document.getElementById('messages').innerHTML = 'Fetching';
      google.script.run
        .withSuccessHandler(onSuccess)
        .withFailureHandler(onFailure)
        .fetchFromGoogleDrive();   
    }
      
    function onSuccess(sHref) 
    {
      if(new String(sHref).valueOf() == new String("").valueOf())
      {
        document.getElementById('messages').innerHTML = 'Nothing to download';
      }
      else
      {
        document.getElementById('messages').innerHTML = 'Success';
        document.getElementById('HiddenClick').href = sHref;
        document.getElementById('HiddenClick').click(); // Must enable Pop Ups for https://script.google.com
      }
    }
    
    function onFailure(error) 
    {
      document.getElementById('messages').innerHTML = error.message;
    }
    
    </script>
  </head>
  <body>
    <div id="messages">Waiting to DownLoad!</div>
    <div>
      <a id="HiddenClick" href="" target="_blank" onclick="google.script.host.close" style="visibility: hidden;">Hidden Click</a>
    </div>
    <div>
      <button type="button" onclick='callFetchGoogleDrive();' id="Fetch">Fetch Now!</button> 
    </div>
  </body>
</html>

code.gs

function doGet(e){
   var serveFile = e.parameter.servefile;
   var id = e.parameter.id;
   
   if(serveFile)
   {
     return downloadFile(id); // and Hyde
   }
   
  return HtmlService.createHtmlOutputFromFile('form.html'); // Jekyll
}

function fetchFromGoogleDrive() { // Jekyll
  var fileslist = DriveApp.searchFiles("your search criteria goes here + and trashed = false"); // the 'and trashed = false' prevents the same file being download more than once
  
  if (fileslist.hasNext()) {
    var afile = fileslist.next();
    var html = ScriptApp.getService().getUrl()+"?servefile=true&id="+afile.getId();
    return html;
  }
  else
  {
    return '';
  }
}
   
function downloadFile(id){ // and Hyde  
  try
  {
    var afile = DriveApp.getFileById(id);
  
    var aname = afile.getName();
    var acontent = afile.getAs('text/plain').getDataAsString();
    
    var output = ContentService.createTextOutput();
    output.setMimeType(ContentService.MimeType.CSV);
    output.setContent(acontent);
    output.downloadAsFile(aname);
    afile.setTrashed(true);
    return output;
  }
  catch (e) {
    return ContentService.createTextOutput('Nothing To Download')
  }
}

Hur det fungerar

Google Drive (fristående) webbapp för att automatiskt ladda ner (Poll) filer från Drive till användarens lokala PC (Ladda ner mapp).

DriveApp tillhandahåller mekanismer för att söka och ladda ner filer. Men nedladdningsmekanismen har några allvarliga begränsningar på grund av klient / serverarkitekturen som Google Apps ärvt. (Inget fel hos Google)

DriveApp på serversidan tillhandahåller inte en direktfunktion att ladda ner till den lokala datorn eftersom servern inte har något begrepp om var klienten är och nedladdning av filen till själva servern skulle vara meningslös.

Serverns sidkod behöver en mekanism för att tillhandahålla klientsidokoden fildata eller en länk till fil. Båda dessa mekanismer tillhandahålls men data från den förstnämnda är begränsad till att användas direkt av klientsidokoden. Klienten har ingen mekanism för att spara data, en gång erhållna, till den lokala datorn. Så det kan användas för att visa informationen på själva webbsidan.

Den andra mekanismen gör det möjligt att skicka url-adressen till skriptet (sig själv) eller url-filen för Drive-filen. URL-filen till Drive är inte särskilt användbar eftersom den inte kan användas direkt i klientens webbläsare för att ladda ner filen. Att placera denna url i ankare (och klicka på den) resulterar bara i en webbsida som öppnas men som faktiskt inte gör någonting (med undantag för att visa filen online).

Det lämnar skriptadressen. Men skriptadressen ger bara skriptet och inte filen.

För att initiera en nedladdning måste filen från Drive-tjänsten returneras från doGet / doPost-funktionen på serversideskriptet med hjälp av ContentService createTextOutput exakt som visas i Googles onlineguider. Men det innebär att det inte kan finnas något annat UI-element på webbsidan som genereras av resultaten som returneras av doGet / doPost.

Detta ger oss en mycket oattraktiv lösning. En tom webbsida utan användargränssnitt för användare som laddar ner en sida stängs och som kräver att manuellt öppnas när det krävs ytterligare en nedladdning.

Uppenbarligen kan en annan webbhotell tillhandahålla användargränssnittet och länken till Web App Download-skriptet för att lösa problemet.

Detta manus använder en Dr Jekyll- och Herr Hyde-strategi för att lösa denna fråga.

Om skriptet öppnas utan parametrar för GET (doGet), är det standard att visa ett formulär. Detta kommer att vara villkoret när den publicerade appen först öppnas av en användare. Formen i detta exempel är extremt enkel.

Om skriptet öppnas med parametern servefile = true, fungerar skriptet som en nedladdning av Drive-filen.

Javascript för klientsidan innehåller en pollingmekanism (händelsetimer setInterval) som med jämna mellanrum ringer serversideskriptet för att kontrollera om det finns en annan fil att ladda ner.

När serversideskriptet körs om det hittar någon Drive-fil som matchar sökkriterierna * returnerar det URL till skriptet själv bifogat med parametrarna:

? Servefile = true & id = the_id_of_the_google_drive_file

(* Sökkriterierna i det här enkla exemplet är hårdkodade i serversidesskriptet. Det kan lätt överföras från klienten till servern om det behövs.)

Denna information returneras som en sträng till klienten via den erkända withSuccessHandler-mekanismen.

Klientjava-skriptet uppdaterar sedan HREF för ett doldt ankare med denna returnerade information och klickar sedan på ankaret automatiskt.

Detta gör att en annan kallelse av appen / skriptet startas. När den nya anropen av appen startar kommer doGet att upptäcka serverfil-parametern och istället för att returnera användargränssnittet kommer den att returnera filen till webbläsaren. Filen som returneras kommer att vara den som identifierats med den angivna ID-parametern som tidigare returnerades av den sökning som beskrivs ovan.

Med tanke på att filen med det medföljande IDet fortfarande finns kommer den att laddas ner och den nya anropet till appen stängs och lämnar den första åkallelsen för att upprepa denna process.

En knapp finns på det enkla gränssnittet om användaren / testaren blir otålig med att vänta på timern men den krävs inte och kan annars tas bort.

Den enkla formen kan naturligtvis utökas för att ge ett rikare användargränssnitt vid behov. Till exempel att tillhandahålla filsökningskriterierna.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow