2011-11-10 8 views
1

私はGoogle Apps Scriptを利用する最初のアプリケーションを構築中です。 Googleドキュメントリストにファイルをアップロードするためのフォームが必要です。FormPanelを使用しないGoogle Apps Script FileUpload()

function doGet(e) { 
    var app = UiApp.createApplication().setTitle("Upload CSV to Sheet"); 
    var form = app.createFormPanel().setId('frm').setEncoding('multipart/form-data'); 
    var formContent = app.createVerticalPanel(); 
    form.add(formContent); 
    formContent.add(app.createFileUpload().setName('thefile')); 
    formContent.add(app.createSubmitButton('Submit')); 
    app.add(form); 
    return app; 
} 

function doPost(e) { 
    // data returned is a blob for FileUpload widget 
    var fileBlob = e.parameter.thefile; 
    var doc = DocsList.createFile(fileBlob); 
    app.close(); 
    return app; 
} 

しかし、私はSubmitボタンのための私自身のクリックハンドラを指定し、可能な場合は、POSTを待たずしたい:私は現在Google Apps Script FileUpload docmentationに基づいて、この作業を使用してコードを持っています。上記のコードをこのように変更しようとしたとき、e.parameter.thefileへの参照はnullであり、ファイルblobは含まれていません。

function doGet(e) { 

    var app = UiApp.createApplication().setTitle("Upload CSV to Sheet"); 
    var formContent = app.createVerticalPanel(); 
    var submitServerHandler = app.createServerClickHandler('submitHandler_'); 
    formContent.add(app.createFileUpload().setName('thefile')); 
    submitServerHandler.addCallbackElement(formContent); 
    formContent.add(app.createButton('Submit').addClickHandler(submitServerHandler)); 
    app.add(formContent); 
    return app; 
} 

function submitHandler_(e) { 
    // data returned is a blob for FileUpload widget 
    var fileBlob = e.parameter.thefile; 
    var doc = DocsList.createFile(fileBlob); 
    app.close(); 
    return app; 
} 

FormPanelなしでFileUploadコントロールを使用することはできますか?もしそうなら、どうですか?ありがとう!

+0

この質問は、DocsListのような廃止されたクラスを使用しています。 –

答えて

4

ファイルのアップロードにはdoPostを使用する必要があります。送信ボタンにクリックハンドラを追加することができます。 UIで高速応答を望む場合は、クライアントサイドハンドラを使用します。フォームパネル上にある名前がe.parameterに渡され、通常のhtml形式のようなhiddensを使用できます。

あなたは何をしたいですか?それはあなたに良い答えを与えるのに役立ちます。

+0

+1お返事ありがとうございます。私の目標は、より大きなデータ入力フォームの一部としてファイルをアップロードすることでした。ユーザーがフォーム上の残りのデータを送信せずに「アップロード」ボタンをクリックしたときにファイルをアップロードできるようにしたいと考えていました。 – DrewCo

+1

これはもともと答えられて以来、これは変更されているかもしれません - アップロードは 'doGet()'からうまくいく可能性があります。 ([その他の回答](http://stackoverflow.com/a/16461925/1677912)を参照してください。 – Mogsdad

1
function doGet(e) { 
    var app = UiApp.createApplication(); 
    var panel = app.createVerticalPanel().setId('panel'); 
    var fileUpload = app.createFileUpload().setName('theFile').setId('theFile'); 
    var handler = app.createServerChangeHandler('uploadfile'); 
    handler.addCallbackElement(panel); 
    fileUpload.addChangeHandler(handler); 
    panel.add(fileUpload); 
    app.add(panel); 
    return app; 
} 

function uploadfile(e) 
{ 
// data returned which can be used to create a blob 
// assuming mime-type to be a zip file in this example 
    var fileBlob = Utilities.newBlob(e.parameter.thefile, "application/zip","myZippedFile.zip"); 
    var doc = DocsList.createFile(fileBlob); 
    var app = UiApp.getActiveApplication(); 
    app.getElementById('panel').add(app.createLabel('File Uploaded successfully')); 
    return app; 
} 

https://sites.google.com/site/appsscripttutorial/user-interface/upload-doc

+2

私はこれを試して、ファイルを作成しますが、ファイルはゼロ、ゼロです。 'theFile'のe.parameterは' undefined'を返します。私はこのコードが動作するとは思わない。私が間違っていることを証明してください。私はこれを行う方法を探しています。 –

+2

typo( 'theFile'の代わりに 'thefile')がありましたが、作成されたファイルはまだ空です。私の結論は、ファイルアップロードのためにFormPanelを使用する必要があるということです。 – Itangalo

0

からファイルをアップロードするための別のアプローチは、createDocsListDialog()を使用しています。これにより、ユーザーのGoogleドライブからのファイルの選択のみが許可されますが、一方で、これらのファイルを使用して多くのことを行うことができます(FormPanelなしでの作業も含む)。

は(Googleのドキュメントのhttps://developers.google.com/apps-script/reference/ui/docs-list-dialogを参照してください。)

+0

質問に「Googleドキュメントリストへのファイルのアップロードを許可する」と具体的に言われています。ドライブに既にあるファイルを開くことは対象外ですので、あなたの答えは無関係です。申し訳ありませんが、個人的な犯罪はありません;-) –

+0

良い点 - 犯行はありません。 :-) – Itangalo

0

を私はファイルのアップロードにもう少し働いてきた、と私は他のUIと同じように使用することができます「擬似ウィジェット」を作成し、いくつかのヘルパー関数を書きました要素。

他の人にも役立つように、https://github.com/Itangalo/gashというヘルパー関数のコレクションに追加しました。

あなたは上記のサイトからgash.gsにコードを追加した場合、あなたはこのようなファイルのアップロードを管理することができます。

function doGet() { 
    var app = UiApp.createApplication(); 

    // We must have a handler set up before creating the file upload. 
    var handler = app.createServerHandler('handlerCallback'); 
    app.add(gash.createFileUpload('myFile', handler)); 

    app.add(app.createButton('Do something with the file', handler)); 

    return app; 
} 

function handlerCallback(eventInfo) { 
    // The ID of the file in Google Drive is stored in the parameters. 
    var file = DocsList.getFileById(eventInfo.parameter.myFile); 
    // The file was uploaded to the trash. Don't forget to un-trash it. 
    file.setTrashed(false); 

    // Do whatever you want with the file. 
    var app = UiApp.getActiveApplication(); 
    app.add(app.createLabel('Your file size in bytes: ' + file.getSize())); 
    return app; 
} 

ありFormPanelがバックグラウンドでまだですが、この方法は、私が持っていませんそれに触れる。

+0

それはあなたが提供するコードはあまり意味がありません。ヘルパー関数は、あなたのように使用するライブラリに含まれなければなりません。なぜあなたの図書館を公開し、その鍵を見せないのですか?あるいは、少なくともそれを使用する前にそれをしなければならないことを説明しますか?あなたはplsを明確にできますか?また、doGet/doPostの古典的な構造を使用するのはとても迷惑なものですか?私はそれを使用しても問題ありません:-) –

+0

ライブラリは、コメント、GPLライセンス、およびすべてで追加したリンクから入手できます。 (この例は、どのように使用できるかを示すためのものであり、どのように動作しているかを説明するものではありません。)GAS上で共有されるライブラリではありませんが、十分に成熟すれば可能です。 doGet/doPostに関する厄介なことは、少なくとも私にとっては、他の入力とは違ったファイルアップロードを管理する必要があることです(これは標準のハンドラを使って管理できます)。また、この質問のタイトルはFormPanelのないファイルのアップロードに関するものです。 (私はちょっと踏みつぶられていると感じています。私が思いついた解決策を共有しようとしています) – Itangalo

+0

私のコメントが難読化されていたら申し訳ありませんが、それは私の意図ではありませんでした;-)私は見ましたあなたのリンクでは、ライブラリの言及を見ていない、私は主にそのコードを見て、私はUiとフォームを構築するとき(私が言ったように)私を悩ませていなかった何かのための多くの仕事だった。私のコメントは主に、ここに示されているコードがライブラリをライブラリとして必要とし、ライブラリなしでは動作しないことに注意を払うことでした。 PS:今私はあなたの記事を次のようにコメントしていることがわかります...あなたは私があなたを( "XD")探していると思うでしょうが、私はそうではありません!これは純粋な偶然です、私を信じて! –

関連する問題