Szukaj…


Wprowadzenie

Ten prosty skrypt aplikacji Google (samodzielny) umożliwia wielokrotne pobieranie danych z Dysku Google w celu pobrania plików na lokalny komputer użytkownika. Pokazuje, jak użyć jednego skryptu aplikacji, aby zapewnić funkcję zarówno: 1. Interfejsu użytkownika (w tym przykładzie prostego) 2. Strony pobierania plików. Aby uzyskać pełniejsze wyjaśnienie tego, jak to działa, przeczytaj przykład „Jak to działa”.

Uwagi

Skrypt internetowy musi zostać opublikowany, aby działał.

Wyskakujące okienka muszą być włączone dla 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')
  }
}

Jak to działa

Aplikacja internetowa Dysk Google (samodzielna) do automatycznego pobierania plików (Sonda) z Dysku na komputer lokalny użytkownika (folder pobierania).

DriveApp zapewnia mechanizmy wyszukiwania i pobierania plików. Jednak mechanizm pobierania ma poważne ograniczenia ze względu na odziedziczoną przez Google Apps architekturę klient / serwer. (Bez winy Google)

DriveApp po stronie serwera nie zapewnia bezpośredniej funkcji pobierania na lokalny komputer, ponieważ serwer nie ma pojęcia, gdzie jest klient, a pobranie pliku na sam serwer byłoby bez znaczenia.

Kod po stronie serwera wymaga mechanizmu zapewniającego kod po stronie klienta dane pliku lub łącze do pliku. Oba te mechanizmy są zapewnione, ale dane z tego pierwszego są ograniczone do bezpośredniego wykorzystania przez kod po stronie klienta. Klient nie ma mechanizmu zapisywania uzyskanych danych na lokalnym komputerze. Można go więc użyć do wyświetlenia danych na samej stronie internetowej.

Drugi mechanizm pozwala na zwrot adresu URL skryptu (samego) lub adresu URL pliku Dysku. Adres URL pliku na Dysku nie jest zbyt przydatny, ponieważ nie można go użyć bezpośrednio w przeglądarce klienta do pobrania pliku. Umieszczenie tego adresu URL w zakotwiczeniu (i kliknięcie go) powoduje tylko otwarcie strony internetowej, ale w rzeczywistości nic nie robi (z wyjątkiem ewentualnego przeglądania pliku online).

To pozostawia adres skryptu. Jednak adres URL skryptu zawiera tylko skrypt, a nie plik.

W celu zainicjowania pobierania plik z usługi Dysk musi zostać zwrócony z funkcji doGet / doPost skryptu po stronie serwera za pomocą ContentService createTextOutput dokładnie tak, jak pokazano w internetowych przewodnikach Google. Oznacza to jednak, że na stronie internetowej nie może być innego elementu interfejsu użytkownika generowanego przez wyniki zwracane przez doGet / doPost.

To pozostawia nam bardzo nieatrakcyjne rozwiązanie. Pusta strona internetowa bez elementów interfejsu użytkownika, która pobiera stronę, zamyka się i wymaga ręcznego otwarcia, gdy wymagane jest kolejne pobranie.

Oczywiście inna strona internetowa hostingu może zawierać interfejs użytkownika i link do skryptu pobierania aplikacji sieci Web, aby rozwiązać ten problem.

Ten skrypt wykorzystuje podejście Dr Jekyll i Mr Hyde w celu rozwiązania tego problemu.

Jeśli skrypt zostanie otwarty bez parametrów do GET (doGet), domyślnie zostanie wyświetlony formularz. Będzie to warunek, gdy opublikowana aplikacja zostanie po raz pierwszy otwarta przez użytkownika. Formularz podany w tym przykładzie jest niezwykle prosty.

Jeśli skrypt zostanie otwarty z parametrem servfile = true, skrypt zachowa się jak pobrany plik Dysku.

Javascript po stronie klienta zawiera mechanizm odpytywania (timer zdarzenia setInterval), który okresowo wywołuje skrypt po stronie serwera, aby sprawdzić dostępność innego pliku do pobrania.

Po wykonaniu skryptu po stronie serwera, jeśli znajdzie plik Dysku spełniający kryteria wyszukiwania *, zwraca adres URL skryptu z dołączonymi parametrami:

? servfile = true & id = the_id_of_the_google_drive_file

(* Kryteria wyszukiwania w tym prostym przykładzie są zakodowane na stałe w skrypcie po stronie serwera. W razie potrzeby można je łatwo przekazać klientowi na serwer.)

Informacje te są zwracane do klienta w postaci ciągu za pośrednictwem rozpoznawanego mechanizmu withSuccessHandler.

Następnie skrypt java klienta aktualizuje HREF ukrytej kotwicy o te zwrócone informacje, a następnie automatycznie klika kotwicę.

Powoduje to uruchomienie innego wywołania aplikacji / skryptu. Po uruchomieniu nowego wywołania aplikacji doGet wykryje parametr servfile i zamiast zwrócić interfejs użytkownika zwróci plik do przeglądarki. Zwrócony plik będzie identyfikowany przez podany parametr ID, który został wcześniej zwrócony podczas wyszukiwania opisanego powyżej.

Biorąc pod uwagę, że plik o podanym identyfikatorze nadal istnieje, zostanie pobrany, a nowe wywołanie aplikacji zostanie zamknięte, pozostawiając pierwsze wywołanie w celu powtórzenia tego procesu.

Na prostym interfejsie znajduje się przycisk, jeśli użytkownik / tester niecierpliwi się czekaniem na licznik czasu, ale nie jest to wymagane i może zostać w inny sposób usunięte.

Prostą formę można oczywiście rozszerzyć, aby w razie potrzeby zapewnić bogatszy interfejs użytkownika. Takie jak podanie kryteriów wyszukiwania plików.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow