google-apps-script
Google 웹 앱 스크립트를 사용하여 Google 드라이브에서 자동 다운로드
수색…
소개
비고
웹 스크립트는 작동하기 위해 게시되어야합니다.
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를 가진 파일이 여전히 존재한다는 것을 감안할 때 다운로드되고 앱의 새로운 호출이 닫히고 첫 번째 호출이이 프로세스를 반복하게됩니다.
사용자 / 테스터가 타이머를 기다리는 데 참을성이 없어지더라도 버튼이 필요하지 않고 제거 될 수있는 경우 간단한 인터페이스에 버튼이 제공됩니다.
물론 필요한 경우보다 간단한 사용자 인터페이스를 제공하기 위해 간단한 양식을 확장 할 수 있습니다. 파일 검색 기준을 제공하는 것.