google-apps-script
Googleドライブから自動ダウンロードするGoogle Web Appスクリプト
サーチ…
前書き
備考
Web Scriptは、動作させるために公開する必要があります。
ポップアップは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ドライブ(スタンドアロン)Web Appを使用して、ドライブからユーザーのローカルPC(ダウンロードフォルダ)にファイルを自動的にダウンロード(ポーリング)できます。
DriveAppは、ファイルの検索とダウンロードのためのメカニズムを提供します。しかし、ダウンロードメカニズムには、Google Appsが継承したクライアント/サーバーアーキテクチャのためにいくつかの重大な制限があります。 (Googleの不具合はありません)
サーバ側DriveAppは、クライアントがどこにいるのかという概念を持たず、サーバ自体にファイルをダウンロードすることが無意味であるため、ローカルPCにダウンロードする直接機能を提供しません。
サーバー側コードには、クライアント側コードにファイルデータまたはファイルへのリンクを提供するメカニズムが必要です。どちらのメカニズムも提供されていますが、前者からのデータはクライアント側のコードによって直接使用されることに限定されています。クライアントは、取得したデータをローカルPCに保存する仕組みがありません。したがって、Webページ自体にデータを表示するために使用できます。
2番目のメカニズムでは、スクリプトのURL(それ自体)またはドライブファイルのURLを返すことができます。ドライブファイルのURLは、クライアントブラウザでファイルをダウンロードするために直接使用することはできません。このURLをアンカーに置いて(クリックするだけで)、開いても実際には何もしません(おそらくファイルをオンラインで見ることを除いて)。
それはスクリプトのURLを残します。しかし、スクリプトのURLは、スクリプトではなく、ファイルを提供します。
ダウンロードを開始するには、Driveサービスからのファイルを、Googleオンラインガイドに示されているように、ContentService createTextOutputを使用してサーバーサイドスクリプトのdoGet / doPost関数から返す必要があります。しかしこれは、doGet / doPostによって返された結果によって生成されたWebページに他のUI要素が存在しないことを意味します。
これは私たちに非常に魅力的な解決策を残します。ページをダウンロードするユーザUI要素のない空白のWebページが閉じて、別のダウンロードが必要なときに手動で開く必要があります。
明らかに別のホスティングWebページは、この問題を解決するためにUIとWeb Appダウンロードスクリプトへのリンクを提供することができます。
このスクリプトでは、この問題を解決するためにDr Jekyll氏とHyde氏のアプローチを使用しています。
スクリプトがGET(doGet)へのパラメータなしでオープンされている場合は、デフォルトでフォームが表示されます。これは、公開されたアプリがユーザーによって最初に開かれたときの状態になります。この例で提供されるフォームは非常に簡単です。
パラメータがservefile = trueの状態でスクリプトを開くと、スクリプトはドライブファイルのダウンロードとして動作します。
クライアントサイドのjavascriptには、定期的にサーバーサイドスクリプトを呼び出してダウンロードする別のファイルの可用性をチェックするポーリングメカニズム(イベントタイマーsetInterval)が含まれています。
検索条件に一致するドライブファイルが見つかった場合にサーバーサイドスクリプトが実行されると、スクリプトのURLにパラメータが追加されたURLが返されます。
?servefile = true&id = the_id_of_the_google_drive_file
(*この単純な例の検索基準は、サーバーサイドスクリプトにハードコードされています。必要に応じてクライアントからサーバーに簡単に渡すことができます)。
この情報は、認識されたwithSuccessHandlerメカニズムを介して文字列としてクライアントに返されます。
クライアントのJavaスクリプトは、この返された情報で隠れたアンカーのHREFを更新し、アンカーを自動的にクリックします。
これにより、app / scriptの別の呼び出しが起動されます。アプリケーションの新しい呼び出しが起動すると、doGetはservefileパラメータを検出し、ユーザーインターフェイスを返す代わりにファイルをブラウザに返します。返されるファイルは、前述の検索によって以前に返された提供されたIDパラメータによって識別されるファイルになります。
提供されたIDを持つファイルがまだ存在する場合、それはダウンロードされ、アプリケーションの新しい呼び出しが閉じられ、最初の呼び出しでこのプロセスが繰り返されます。
ユーザー/テスターがタイマーを待つことに不便な場合、単純なインターフェースにボタンが提供されますが、それは必須ではなく、そうでなければ削除することができます。
シンプルなフォームはもちろん、必要に応じてより豊かなユーザーインターフェイスを提供するように拡張することもできます。ファイル検索基準を提供するなど。