質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1231閲覧

google.script.runが実行されない

recruiter

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2024/04/02 02:55

実現したいこと

GASを使ってGoogleドライブへのログイン不要ファイルアップローダー作りたいと考えています。
https://qiita.com/v2okimochi/items/06ed1ce7c56a877a1e10
上記ページを参考にしました。
現在関数が実行されなくて困っています。

発生している問題・分からないこと

①HTML
53行目:google.script.run.withSuccessHandler(updateView).processForm(formObject);
上記が実行されない

エラーメッセージ

error

1appscriptの実行数からログを確認しましたが、 2dogetは実行されていますが、 3processForm(formObject)は実行されていないことを確認しています。 4

該当のソースコード

HTML

1<!DOCTYPE html> 2<html> 3 4 <body> 5 <div id="myform" style="text-align:center;"> 6 ファイルを選択してからアップロードしてください(10MBまで)<br><br> 7 <form> 8 <input id="file" name="myFile" type="file" onchange="changeSubmitButton()" /> 9 10 <button id="upload" type="button">Submit</button> 11 12 </form> 13 <label id="upload_label"></label> 14 </div> 15 16 17 <script> 18 function preventFormSubmit() { 19 var forms = document.querySelectorAll('form'); 20 for (var i = 0; i < forms.length; i++) { 21 forms[i].addEventListener('submit', function(event) { 22 event.preventDefault(); 23 }); 24 } 25 } 26 window.addEventListener('load', preventFormSubmit); 27 /*最初はアップロードボタンを押せないようにしておく*/ 28 document.addEventListener("DOMContentLoaded", function () { 29 document.getElementById("upload").disabled = true; 30 }, false); 31 /*制限サイズ以内のファイルが選択されたらアップロードボタンを押せるようにする*/ 32 function changeSubmitButton() { 33 const len=document.getElementById("file").files.length; 34 const size=document.getElementById("file").files[0].size; 35 const maxSize=1024 * 1024 * 10;//10MB 36 const uploadButton=document.getElementById("upload"); 37 if (len > 0 && size < maxSize) { 38 uploadButton.disabled = false; 39 } 40 else{ 41 uploadButton.disabled = true; 42 } 43 } 44 45 document.getElementById("upload").addEventListener('click', handleFormSubmit); 46 47 48 /*アップロードボタンが押されたらファイルをアップロード*/ 49 function handleFormSubmit(formObject) { 50 document.getElementById("upload").disabled = true; 51 const div1 = document.getElementById('upload_label').textContent = "uploading..."; 52 //アップロード成功した場合はupdateView()実行 53 google.script.run.withSuccessHandler(updateView).processForm(formObject); 54 } 55 /*アップロード完了画面に変える(動的)*/ 56 function updateView() { 57 var div1 = document.getElementById('upload_label').textContent = "uploaded"; 58 } 59 </script> 60 61 </body> 62 63</html> 64

javascript

1const folderID = "1****************************"; 2const SPREAD_ID = "1********************************"; 3const SPREAD = SpreadsheetApp.openById(SPREAD_ID); 4const sheetmeet = SPREAD.getSheetByName("シート1"); 5 6 7function doGet() { 8 return HtmlService.createHtmlOutputFromFile('index'); 9} 10 11function processForm(formObject) { 12 var formBlob = formObject.myFile; 13 14 var uploadFolder = DriveApp.getFolderById(folderID); 15 var driveFile = uploadFolder.createFile(formBlob);//アップロード 16 var file_url = driveFile.getUrl(); 17 18 return file_url; 19 20} 21

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ファイルのアップロードボタンを複数設置する予定があるため、
onsubmitは使っていません。

https://qiita.com/v2okimochi/items/06ed1ce7c56a877a1e10
上記ページのように

<form onsubmit="handleFormSubmit(this)"> とすると動きますが、 onsubmitを削る代わりに、 document.getElementById("upload").addEventListener('click', handleFormSubmit); と途中に入れています。 ですが、 google.script.run.withSuccessHandler(updateView).processForm(formObject); を読み込んでくれていないように思えます。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

recruiter

2024/04/02 03:38

ご連絡ありがとうございます。 素人なもので回答にズレがあるかもしれませんが アップロードするものは画像のみです。 formObjectは画像となりますでしょうか。 宜しくお願い致します。
Lhankor_Mhy

2024/04/02 03:50 編集

ならないと思います。確認してみてください。 初心者の方とのことでしたので、確認方法がわからないようでしたら 「console.log」でググってみるといいと思います。
Lhankor_Mhy

2024/04/02 04:23

初心者の方とのことでしたので、先ほどのドキュメントの引用も難しかったかもしれません。 念のため補足すると、「想定されていないものを送信しようとすると失敗します」という内容が書かれています。受けつけるものは大雑把に言うと、文字列、数値、あるいは文字列・数値だけで構成されている配列・オブジェクトということのようです。
recruiter

2024/04/02 04:26

ご連絡ありがとうございます。 GASスクリプト側にconsole.log(formObject)を入れてみました。 function processForm(formObject) { var formBlob = formObject.myFile; var uploadFolder = DriveApp.getFolderById(folderID); var driveFile = uploadFolder.createFile(formBlob);//アップロード var file_url = driveFile.getUrl(); console.log(formObject) return file_url; 実行ログの欄に下記エラーが表示されています。 TypeError: Cannot read properties of undefined (reading 'myFile') processForm @ upload3.gs:15 (gs:15は var formBlob = formObject.myFile;です。) 2度も丁寧なご回答ありがとうございます。
recruiter

2024/04/02 04:29

つまりHTML側の49行目 function handleFormSubmit(formObject) { の部分で止まってしまっているということでしょうか? デプロイしてwebアプリで表示させ、 画像をアップロードすると 画面に 「uploading...」が表示されるため、 51行目までは読み込んでいると思っておりました。
Lhankor_Mhy

2024/04/02 04:30

なるほど、processForm が実行されていないことを確認している、というのは勘違いで、実際には実行されているがエラーになっている、だったのですね。 これで問題が解決しそうですか?
Lhankor_Mhy

2024/04/02 04:31

おや、コメント行き違い
recruiter

2024/04/02 04:36

コメントありがとうございます。 google apps scriptの管理画面で 実行数のページを見ると、 関数dogetは実行のログはありますが、 関数processFormは実行された履歴がなく、 エラーも表示されていません。 おそらく実行されていないと思うのですがどうでしょうか? HTML側の問題でしょうか?
Lhankor_Mhy

2024/04/02 04:47

すみません、コードがある程度かける方を想定してコメントしていたので不親切になっていたようです。 コードを実行して試していませんが、function handleFormSubmit(formObject) {... の formObject にはイベントオブジェクトが入っているはずです。 想定と違うものが入っているのでエラーを起こしているのだと想像しています。 ですので、想定しているフォーム要素を渡すことによってエラーが解消できるのではないか、と考えています。 フォーム要素の取得の方法は大丈夫そうですか? --- > おそらく実行されていないと思うのですがどうでしょうか? ああ、そうですね、おっしゃる通りでした。gasの方でエラーが出てるのかと勘違いしました。
recruiter

2024/04/02 05:19

ご丁寧にありがとうございます。 ほぼコードは書けない素人なため大変勉強になります。 HTML側(フォーム)では ファイルを選択して、画像をアップロードするだけのものになります。 参考にしたURL通りに onsubmitを使ってやると動くのですが、 先に書いたとおり複数のボタンを設置するのでonsubmitが使えないため、 このようにHTMLを書くとどうしてもエラーになってしまいます。 フォーム要素はおそらく大丈夫かと思います。
Lhankor_Mhy

2024/04/02 05:40

わかりにくくてすみません。 『フォーム要素の取得の方法は大丈夫そうですか?』とお尋ねしたのは、フォーム要素を取得してprocessFormに渡す必要がありますが、その取得の方法については当方の手助けがなくても大丈夫そうですか? という意図でした。 もし、手助けが必要であったり、そもそもコメントの意味が分からないというようなことであればお知らせください。 もし、手助けが不要であればおそらく解決するだろうと思いますので、自己解決の処理をお願いします。
recruiter

2024/04/02 05:53

昨日から試行錯誤しているのですがどうも上手くいきません。 ご指摘いただきましたフォーム要素も自信がないです。 大変お手数をおかけしますが お手伝い頂けると幸いです。 宜しくお願い致します。
guest

回答1

0

ベストアンサー

フォーム要素の取得、というかフォーム要素に限らず要素を取得する場合には、id または class があった方がいいです。
なくてもいいけど、あった方がいいです。

なので、まずは id をつけましょう。名前は何でもいいのですが、ここではform1にします。 

html

1<form>

html

1<form id="form1">

id を付けた要素は、document.getElementById()で取得できます。

js

1const formObject1 = document.getElementById('form1')

あとはこれを送信してみてください。

js

1google.script.run.withSuccessHandler(updateView).processForm(formObject1);

これで動作すると思います、たぶん。

投稿2024/04/02 06:17

Lhankor_Mhy

総合スコア37437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

recruiter

2024/04/02 06:35

回答ありがとうございます。 解決しました! 本当にありがとうございます。 大変お手数をおかけしますがいくつか質問させてください。 ①formObjectに入るのは、フォーム要素である。 <form id="form1"> <input id="file" name="myFile" type="file" onchange="changeSubmitButton()" /> <button id="upload" type="button">Submit</button> </form> 上記で選択した画像に関する要素がformObjectとして入るということで合ってますでしょうか? ②google.script.runについて google.script.run.withSuccessHandler(コールバック関数).関数(引数)と教科書で書いてましたが、 今回、 google.script.run.withSuccessHandler(updateView).processForm(formObject); ↓ google.script.run.withSuccessHandler(updateView).processForm(formObject1); このように変更しました。 本来、 processForm(formObject)←ここの部分でGASの関数を発火させるためのものではないのでしょうか? コードは下記のように変更してます。 function handleFormSubmit(formObject) { const formObject1 = document.getElementById('form1') document.getElementById("upload").disabled = true; const div = document.getElementById('upload_label').textContent = "uploading..."; //アップロード成功した場合はupdateView()実行 google.script.run.withSuccessHandler(updateView).processForm(formObject1); }
Lhankor_Mhy

2024/04/02 06:50

> ①formObjectに入るのは、フォーム要素である 打ち間違いだと思いますが、フォーム要素が入っている変数は、formObject ではなくて formObject1 です。formObject にはイベントが入っています。 formObject1 に入っているのはフォーム要素であって、選択した画像に関する要素はそこから副次的に取得できるものです。 --- ②については、すみませんが何を問われているのかよくわかりませんでした。
recruiter

2024/04/02 06:54

何度も申し訳ございません。 <form id="form1"> 上記を<formではなく <div id="form1">とすると以前と同じように動かなくなりましたが、 divで囲った要素ではダメなのでしょうか?
Lhankor_Mhy

2024/04/02 06:56

> divで囲った要素ではダメなのでしょうか? はい、そうですね。
recruiter

2024/04/02 07:57

ご連絡ありがとうございます。 現在、 <form action="https://docs.google.com/forms/***************/formResponse" method="POST"> <input type="text" name="entry.*******" placeholder="氏名" value="" size="30" maxlength="128"> <div id="form1"> <input id="file" name="myFile" type="file" onchange="changeSubmitButton()" /> <button id="upload" type="button">Submit</button> </div> <input type="submit" value="確認画面へ"> </form> 上記にさらに画像をアップロードするボタンを設置する予定です。 今回、 <form="form1">で取得した要素をformObject1に投げているのだと思いますが、 上記のような <divではダメでした。 何か代替え案はございますでしょうか? 何度も申し訳ございません。
recruiter

2024/04/02 10:19

先程整理して無事解決しました。 この度は本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問