私は写真撮影コンテストを行っています。競技者はGoogle登録フォームを使用して登録し、自分の写真もアップロードする必要があります。インターネット全体を検索して、フォームに挿入してGoogleフォームを使用してファイルをアップロードできるGoogleスクリプトを見つけましたが、何も見つかりませんでした。それは実行可能であり、どのように実行可能であり、そのようなことを行うための他のアイデアがあったとしても、私に知らせてください。
5 に答える
フォーム、回答を含むスプレッドシート、画像を含むドキュメントを含むワークフローの提案を次に示します。
フォームはここでテスト可能です
スプレッドシートはここで表示できます
ドキュメントはここで表示できます
編集2を参照してください
ノート :
- 今のところ、小さな画像でのみ機能します。そのための解決策を見つける必要があります。(編集を参照)
- スプレッドシートへの画像の挿入がうまくいかないので、とりあえずこの行にコメントしました...
これが完全なコードです。まだドラフトですが、前述の問題の解決策が見つかれば、完全に実装できると思います。
編集: 画像のサイズは実際には関係ありません。ページサイズの 4 倍の画像で成功しましたが、PNG 形式です。このコンテキストでは.pngの方がはるかに信頼性が高いようです。ところで、ブロブ、画像ファイル、またはいわゆるサムネイル (元のサイズとまったく同じサイズです;-) を無差別に使用でき、常に同じ結果が得られます。それについては、別の投稿で質問を投稿する必要があると思います:-D=
var submissionSSKey = '0AnqSFd3iikE3dGFsUWNpb08zVWx5YjFRckloZ0NFZGc';
var docurl = 'https://docs.google.com/document/d/1E6yoROb52QjICsEbGVXIBdz8KhdFU_5gimWlJUbu8DI/'
var listitems = ['Select a category','Portrait','Landscape','Nude','Night shots','Nature','Various']
var Panelstyle = {'background':'#dddddd','padding':'40px','borderStyle':'ridge','borderWidth':'15PX','borderColor':'#aaaaaa'}
function doGet() {
var app = UiApp.createApplication().setTitle('Photography contest').setStyleAttribute('padding','50PX');
var panel = app.createFormPanel().setStyleAttributes(Panelstyle).setPixelSize(400, 200);
var title = app.createHTML('<B>Photography contest</B>').setStyleAttribute('color','grey').setStyleAttribute('fontSize','25PX');
var grid = app.createGrid(6,2).setId('grid');
var list1 = app.createListBox().setName('list1');
for(var i in listitems){list1.addItem(listitems[i])}
var Textbox1 = app.createTextBox().setWidth('150px').setName('TB1');
var email = app.createTextBox().setWidth('150px').setName('mail');
var upLoad = app.createFileUpload().setName('uploadedFile');
var submitButton = app.createSubmitButton('<B>Submit</B>');
var warning = app.createHTML('Please fill in all fields').setStyleAttribute('background','#bbbbbb').setStyleAttribute('fontSize','20px');
//file upload
var cliHandler2 = app.createClientHandler()
.validateLength(Textbox1, 1, 40).validateNotMatches(list1,'Select a category').validateEmail(email).validateNotMatches(upLoad, 'FileUpload')
.forTargets(submitButton).setEnabled(true)
.forTargets(warning).setHTML('Now you can submit your form').setStyleAttribute('background','#99FF99').setStyleAttribute('fontSize','12px');
//Grid layout of items on form
grid.setWidget(0, 1, title)
.setText(1, 0, 'Category')
.setWidget(1, 1, list1.addClickHandler(cliHandler2))
.setText(2, 0, 'Name')
.setWidget(2, 1, Textbox1.addClickHandler(cliHandler2))
.setText(3, 0, 'Email')
.setWidget(3, 1, email)
.setText(4, 0, 'File Upload')
.setWidget(4, 1, upLoad.addChangeHandler(cliHandler2))
.setWidget(5, 0, submitButton)
.setWidget(5, 1, warning);
var cliHandler = app.createClientHandler().forTargets(warning).setHTML('<B>PLEASE WAIT WHILE THE FILE IS UPLOADING<B>').setStyleAttribute('background','yellow');
submitButton.addClickHandler(cliHandler).setEnabled(false);
panel.add(grid);
app.add(panel);
return app;
}
function doPost(e) {
var app = UiApp.getActiveApplication();
var ListVal = e.parameter.list1;
var textVal = e.parameter.TB1;
var Email = e.parameter.mail;
var fileBlob = e.parameter.uploadedFile;
var img = DocsList.createFile(fileBlob);
try{
var folder = DocsList.getFolder('photos');
}catch(e){DocsList.createFolder('photos');var folder = DocsList.getFolder('photos')}
img.addToFolder(folder);
img.removeFromFolder(DocsList.getRootFolder())
var sheet = SpreadsheetApp.openById(submissionSSKey).getSheetByName('Sheet1');
var lastRow = sheet.getLastRow();
// var image = sheet.insertImage(img.getUrl(), 4, lastRow+1)
var targetRange = sheet.getRange(lastRow+1, 1, 1, 4).setValues([[ListVal,textVal,Email,img.getUrl()]]);
var GDoc = DocumentApp.openByUrl(docurl)
GDoc.appendTable([['Category : '+ListVal,'Name : '+textVal,'Email : '+Email]])
var par = GDoc.appendParagraph('IMAGE PREVIEW')
par.insertInlineImage(1, img.getThumbnail())
GDoc.appendHorizontalRule();
GDoc.saveAndClose();
app.add(app.createLabel('Thank you for submitting'));
return app
}
編集 2 : (ほぼ) すべての問題の解決策を見つけました...ドキュメント プレビューの自動画像スケーリングを提供する新しいコード (doPost 部分のみ) を次に示します。jpg、png、またはその他の通常の画像形式がサポートされており、初期サイズ + 重量が表示されます。オンラインテストフォームを更新しました。
スプレッドシートの問題には今のところ解決策がありません。問題 145を参照してください。そのため、画像ファイルへのリンクのみを使用しますが、これには問題 1239に記載されているようにプレビューはありませんが、現在機能しているドキュメントは適切で使用可能な回避策です (私の意見 :-)。
function doPost(e) {
var app = UiApp.getActiveApplication();
var ListVal = e.parameter.list1;
var textVal = e.parameter.TB1;
var Email = e.parameter.mail;
var fileBlob = e.parameter.uploadedFile;
var blob = fileBlob.setContentTypeFromExtension()
var img = DocsList.createFile(blob);
try{
var folder = DocsList.getFolder('photos');
}catch(e){DocsList.createFolder('photos');var folder = DocsList.getFolder('photos')}
img.addToFolder(folder);
img.removeFromFolder(DocsList.getRootFolder());
var weight = parseInt(img.getSize()/1000);
var sheet = SpreadsheetApp.openById(submissionSSKey).getSheetByName('Sheet1');
var lastRow = sheet.getLastRow();
var targetRange = sheet.getRange(lastRow+1, 1, 1, 4).setValues([[ListVal,textVal,Email,img.getUrl()]]);
var GDoc = DocumentApp.openByUrl(docurl)
GDoc.appendTable([['Category : '+ListVal,'Name : '+textVal,'Email : '+Email]])
var inlineI = GDoc.appendImage(img);
var width = inlineI.getWidth();
var newW = width;
var height = inlineI.getHeight();
var newH = height;
var ratio = width/height
Logger.log('w='+width+'h='+height+' ratio='+ratio);
if(width>640){
newW = 640;
newH = parseInt(newW/ratio);
}
inlineI.setWidth(newW).setHeight(newH)
GDoc.appendParagraph('IMAGE size : '+width+' x '+height+' (eventually) resized to '+newW+' x '+newH+' for PREVIEW ('+weight+' kB) ');
GDoc.appendHorizontalRule();
GDoc.saveAndClose();
app.add(app.createLabel('Thank you for submitting'));
return app
}
これを試して
function insertImage() {
// Retrieve an image from the web.
var resp = UrlFetchApp.fetch("http://www.google.com/intl/en_com/images/srpr/logo2w.png");
// Create a document.
var doc = DocumentApp.openById("");
// Append the image to the first paragraph.
doc.getChild(0).asParagraph().appendInlineImage(resp);
}
このリンクも役立つかもしれません:)
http://code.google.com/googleapps/appsscript/class_documentapp_listitem.html#appendInlineImage
ハッピーコーディング!
jfreake の最近の投稿のおかげで、スプレッドシート自体に画像を表示するなど、すべての問題を解決することができました。これが、快適さと読みやすさのために別の回答に投稿した最終的なコードです。
var submissionSSKey = '0AnqSFd3iikE3dGFsUWNpb08zVWx5YjFRckloZ0NFZGc';
var docurl = 'https://docs.google.com/document/d/1E6yoROb52QjICsEbGVXIBdz8KhdFU_5gimWlJUbu8DI/'
var listitems = ['Select a category','Portrait','Landscape','Nude','Night shots','Nature','Various']
var Panelstyle = {'background':'#dddddd','padding':'40px','borderStyle':'solid','borderWidth':'10PX','borderColor':'#bbbbbb'}
function doGet() {
var app = UiApp.createApplication().setTitle('Photography contest').setStyleAttribute('padding','50PX');
var panel = app.createFormPanel().setStyleAttributes(Panelstyle).setPixelSize(400, 200);
var title = app.createHTML('<B>Photography contest</B>').setStyleAttribute('color','grey').setStyleAttribute('fontSize','25PX');
var grid = app.createGrid(6,2).setId('grid');
var list1 = app.createListBox().setName('list1').setWidth('130');
for(var i in listitems){list1.addItem(listitems[i])}
var Textbox1 = app.createTextBox().setWidth('150px').setName('TB1');
var email = app.createTextBox().setWidth('150px').setName('mail');
var upLoad = app.createFileUpload().setName('uploadedFile');
var submitButton = app.createSubmitButton('<B>Submit</B>');
var warning = app.createHTML('Please fill in all fields').setStyleAttribute('background','#bbbbbb').setStyleAttribute('fontSize','18px');
//file upload
var cliHandler2 = app.createClientHandler()
.validateLength(Textbox1, 1, 40).validateNotMatches(list1,'Select a category').validateEmail(email).validateNotMatches(upLoad, 'FileUpload')
.forTargets(submitButton).setEnabled(true)
.forTargets(warning).setHTML('Now you can submit your form').setStyleAttribute('background','#99FF99').setStyleAttribute('fontSize','12px');
//Grid layout of items on form
grid.setWidget(0, 1, title)
.setText(1, 0, 'Category')
.setWidget(1, 1, list1.addClickHandler(cliHandler2))
.setText(2, 0, 'Name')
.setWidget(2, 1, Textbox1.addClickHandler(cliHandler2))
.setText(3, 0, 'Email')
.setWidget(3, 1, email)
.setText(4, 0, 'Image File')
.setWidget(4, 1, upLoad.addChangeHandler(cliHandler2))
.setWidget(5, 0, submitButton)
.setWidget(5, 1, warning);
var cliHandler = app.createClientHandler().forTargets(warning).setHTML('<B>PLEASE WAIT WHILE THE FILE IS UPLOADING<B>').setStyleAttribute('background','yellow');
submitButton.addClickHandler(cliHandler).setEnabled(false);
panel.add(grid);
app.add(panel);
return app;
}
function doPost(e) {
var app = UiApp.getActiveApplication();
var ListVal = e.parameter.list1;
var textVal = e.parameter.TB1;
var Email = e.parameter.mail;
var fileBlob = e.parameter.uploadedFile;
var blob = fileBlob.setContentTypeFromExtension()
var img = DocsList.createFile(blob);
try{
var folder = DocsList.getFolder('photos');
}catch(e){DocsList.createFolder('photos');var folder = DocsList.getFolder('photos')}
img.addToFolder(folder);
img.removeFromFolder(DocsList.getRootFolder());
var weight = parseInt(img.getSize()/1000);
var sheet = SpreadsheetApp.openById(submissionSSKey).getSheetByName('Sheet1');
var lastRow = sheet.getLastRow();
var targetRange = sheet.getRange(lastRow+1, 1, 1, 4).setValues([[ListVal,textVal,Email,"https://drive.google.com/uc?export=view&id="+img.getId()]]);
var imageInsert = sheet.getRange(lastRow+1, 5).setFormula('=image("https://drive.google.com/uc?export=view&id='+img.getId()+'")');
sheet.setRowHeight(lastRow+1, 80);
var GDoc = DocumentApp.openByUrl(docurl)
GDoc.appendTable([['Category : '+ListVal,'Name : '+textVal,'Email : '+Email]])
var inlineI = GDoc.appendImage(img);
var width = inlineI.getWidth();
var newW = width;
var height = inlineI.getHeight();
var newH = height;
var ratio = width/height;
Logger.log('w='+width+'h='+height+' ratio='+ratio);
if(width>640){
newW = 640;
newH = parseInt(newW/ratio);
}
inlineI.setWidth(newW).setHeight(newH)
GDoc.appendParagraph('IMAGE size : '+width+' x '+height+' (eventually) resized to '+newW+' x '+newH+' for PREVIEW ('+weight+' kB) ');
GDoc.appendHorizontalRule();
GDoc.saveAndClose();
app.add(app.createLabel('Thank you for submitting'));
return app
}
編集: yyk が言及したように、 UiApp の「doclist」は 2014 年 12 月 11 日以降非推奨になったため、コードを少し変更してアップグレードします。グーグルドキュメント、人々は自分の写真と名前をフォームにアップロードしました。スプレッドシートは使いません。コードは次のとおりです。
function doGet(e) {
var app = UiApp.createApplication().setTitle('Trombi');
var panel = app.createFormPanel();
var grid = app.createGrid(3,2).setId('registrationGrid');
var nameLabel = app.createLabel('Name');
var nameTextbox = app.createTextBox().setWidth('150px').setName('Name');
var submitButton = app.createSubmitButton('<B>send</B>');
var warning = app.createHTML('<B>Please wait<B>').setStyleAttribute('background','yellow').setVisible(false)
//file upload
var upLoadTypeLabel = app.createLabel('File to Upload');
var upLoad = (app.createFileUpload().setName('thefile'));
//Grid layout of items on form
grid.setWidget(0, 0, nameLabel)
.setWidget(0, 1, nameTextbox)
.setWidget(1, 0, upLoadTypeLabel)
.setWidget(1, 1, upLoad)
.setWidget(2, 0, submitButton)
.setWidget(2, 1, warning)
var cliHandler = app.createClientHandler().forTargets(warning).setVisible(true)
submitButton.addClickHandler(cliHandler);
panel.add(grid);
app.add(panel);
return app;}
function doPost(e) {
var app = UiApp.getActiveApplication();
var Name = e.parameter.Name;
//app.getElementById('info').setVisible(true).setStyleAttribute('color','red');
// data returned is a blob for FileUpload widget
var fileBlob = e.parameter.thefile;
var doc = DriveApp.createFile(fileBlob).setName(Name);
var doc = DocumentApp.openById('your key');
var body = doc.getBody();
var inlineI = body.appendImage(fileBlob);
var width = inlineI.getWidth();
var newW = width;
var height = inlineI.getHeight();
var newH = height;
var ratio = width/height;
Logger.log('w='+width+'h='+height+' ratio='+ratio);
if(width>200){
newW = 200;
newH = parseInt(newW/ratio);
}
inlineI.setWidth(newW).setHeight(newH)
body.appendParagraph(Name);
body.appendHorizontalRule();
doc.saveAndClose();
app.add(app.createLabel('success'));
return app
}