수색…


소개

이 간단한 Google App 웹 스크립트 (독립 실행 형)를 사용하면 사용자의 로컬 PC에 파일을 다운로드하도록 Google 드라이브를 반복적으로 폴링 할 수 있습니다. 하나의 앱 스크립트를 사용하여 다음 두 가지 기능을 제공하는 방법을 보여줍니다. 1. 사용자 인터페이스 (이 예에서는 간단한 인터페이스) 2. 파일 다운로드 페이지. 어떻게 작동하는지에 대한 자세한 설명은 예제 "How it works"를 참조하십시오.

비고

웹 스크립트는 작동하기 위해 게시되어야합니다.

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')
  }
}

작동 원리

Google 드라이브 (독립 실행 형) 웹 앱을 사용하여 드라이브에서 사용자의 로컬 PC (다운로드 폴더)로 파일을 자동 다운로드 (폴링)합니다.

DriveApp는 파일 검색 및 다운로드를위한 메커니즘을 제공합니다. 그러나 다운로드 메커니즘에는 Google Apps가 상속 한 클라이언트 / 서버 아키텍처로 인해 심각한 제한 사항이 있습니다. (Google의 잘못 없음)

서버 측 DriveApp는 로컬 PC로 다운로드 할 수있는 직접 기능을 제공하지 않습니다. 서버가 클라이언트의 위치를 ​​알지 못하고 서버에 파일을 다운로드하는 것이 의미가 없기 때문입니다.

서버 측 코드에는 클라이언트 측 코드에 파일 데이터 또는 파일 링크를 제공하는 메커니즘이 필요합니다. 이러한 메커니즘은 모두 제공되지만 전자의 데이터는 클라이언트 측 코드에서 직접 사용하는 것으로 제한됩니다. 클라이언트는 한번 획득 한 데이터를 로컬 PC에 저장하는 메커니즘이 없습니다. 따라서 웹 페이지 자체에 데이터를 표시하는 데 사용할 수 있습니다.

두 번째 메커니즘을 사용하면 스크립트 URL (자체) 또는 드라이브 파일의 URL을 다시 전달할 수 있습니다. 드라이브 파일 url은 클라이언트 브라우저에서 직접 파일을 다운로드 할 수 없으므로별로 유용하지 않습니다. 이 URL을 앵커에 놓으면 (그리고 클릭하면) 열리는 웹 페이지 만 나타나지만 실제로는 아무 것도하지 않습니다 (온라인에서 파일을 볼 가능성은 제외).

스크립트 URL을 남겨 둡니다. 그러나 스크립트 URL은 파일이 아닌 스크립트 만 제공합니다.

다운로드를 시작하려면 Google 온라인 가이드에 표시된대로 ContentService createTextOutput을 사용하여 서버 측 스크립트의 doGet / doPost 함수에서 Drive 서비스의 파일을 반환해야합니다. 그러나 이는 doGet / doPost에서 반환 한 결과로 생성 된 웹 페이지에 다른 UI 요소가 없을 수 있음을 의미합니다.

이것은 우리에게 매우 매력없는 해결책을 남겨 둡니다. 페이지를 다운로드하는 사용자 UI 요소가없는 빈 웹 페이지가 닫히고 또 다른 다운로드가 필요할 때 수동으로 열어야합니다.

분명히 다른 호스팅 웹 페이지는이 문제를 해결하기 위해 UI 및 웹 앱 다운로드 스크립트에 대한 링크를 제공 할 수 있습니다.

이 스크립트는이 문제를 해결하기 위해 Dr. Jekyll과 Mr Hyde 접근법을 사용합니다.

스크립트가 GET (doGet)에 대한 매개 변수없이 열려 있으면 기본적으로 양식을 표시합니다. 이것은 게시 된 앱이 사용자에 의해 처음 열릴 때의 조건입니다. 이 예제에서 제공되는 양식은 매우 간단합니다.

매개 변수가 servefile = true 인 상태에서 스크립트를 열면 스크립트는 드라이브 파일 다운로드로 작동합니다.

클라이언트 측 javascript에는 정기적으로 서버 측 스크립트를 호출하여 다운로드 할 다른 파일의 가용성을 확인하는 폴링 메커니즘 (이벤트 타이머 setInterval)이 포함되어 있습니다.

검색 기준과 일치하는 드라이브 파일을 찾으면 서버 측 스크립트가 실행될 때 매개 변수가 추가 된 스크립트 자체의 URL을 반환합니다.

? servefile = true & id = the_id_of_the_google_drive_file

(*이 간단한 예제의 검색 기준은 서버 쪽 스크립트에 하드 코딩되어 있으므로 필요한 경우 클라이언트에서 서버로 쉽게 전달할 수 있습니다.)

이 정보는 인식 된 withSuccessHandler 메커니즘을 통해 클라이언트에 문자열로 반환됩니다.

그런 다음 클라이언트 Java 스크립트는이 리턴 된 정보로 숨겨진 앵커의 HREF를 갱신 한 다음 자동으로 앵커를 클릭합니다.

이로 인해 app / script의 다른 호출이 시작됩니다. 응용 프로그램의 새로운 호출이 시작되면 doGet은 servefile 매개 변수를 감지하고 사용자 인터페이스를 반환하는 대신 파일을 브라우저로 반환합니다. 반환 된 파일은 위에 설명 된 검색에서 이전에 반환 된 제공된 ID 매개 변수로 식별되는 파일입니다.

제공된 ID를 가진 파일이 여전히 존재한다는 것을 감안할 때 다운로드되고 앱의 새로운 호출이 닫히고 첫 번째 호출이이 프로세스를 반복하게됩니다.

사용자 / 테스터가 타이머를 기다리는 데 참을성이 없어지더라도 버튼이 필요하지 않고 제거 될 수있는 경우 간단한 인터페이스에 버튼이 제공됩니다.

물론 필요한 경우보다 간단한 사용자 인터페이스를 제공하기 위해 간단한 양식을 확장 할 수 있습니다. 파일 검색 기준을 제공하는 것.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow