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

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

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

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

JavaScript

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

HTML

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

Q&A

1回答

794閲覧

GASでドライブに送ったPDFの中身が適切でない...

katokato123456

総合スコア0

Google Apps Script

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

JavaScript

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

HTML

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

0グッド

2クリップ

投稿2023/12/16 14:42

編集2023/12/17 07:47

実現したいこと

htmlのinputタグ(type="file")でPDFをアップロードしてGASに送って、Googleドライブに保存したいのですが、実際にドライブに保存されたPDFには、以下の文章が記載されたものが保存されており、適切でありませんでした。わかる方がいらっしゃたら教えていただきたいです。

発生している問題・エラーメッセージ![イメージ説明]

実際にPDFファイルとして保存されてたもの⇩
(https://ddjkaamml8q8x.cloudfront.net/questions/2023-12-17/89e67127-5c69-47b2-aaee-5fafea843ec3.png)

該当のソースコード

html

1 <div class="input"> 2 <form action="https://script.google.com/macros/s/AKfycbw6csvxkY10UG5D_eNNPSsqTI0sxhm5qkhBHSRrS_nM4wKfrd1cFUs1Sp0Q4L1AXCbwQg/exec" method="POST"> 3 4 <!--ほかの質問は略--> 5 6 <div style="height: 20px;"></div> 7 <!--No.3--> 8 <legend style="text-align: start;">身分証明書の提出(提出可能書類から1点)*<br>提出可能書類(運転免許証, 運転経歴証明書, パスポート, マイナンバーカード, 在留カード・特別永住者証明書, 官公庁化顔写真を貼付した各種福祉手帳(障がい者手帳など), 各種健康保険証, 顔写真が貼付されていない各種福祉手帳(母子健康手帳など), 住民票の写し・住民票の記載事項証明書, 印鑑登録証明書)</legend> 9 <input type="file" name="fileUpload" accept=".pdf" /> 10 11 <div style="height: 20px;"></div> 12 <div style="width: 100%;text-align: center;"><input id="playButton" class="btn" type="submit" value="送信"></div> 13 </form> 14 <audio id="Audio" src="btn.mp3"></audio> 15 <iframe name="audioFrame" style="display:none;"></iframe> 16 </div> 17 18 <script> 19 var audio = document.getElementById("Audio"); 20 var playButton = document.getElementById("playButton"); 21 22 playButton.addEventListener('click', function() { 23 audio.play(); 24 alert("コメントを送信しました。"); 25 }); 26 </script> 27

GAS

1// フォルダ内で使用可能なファイル名を取得する関数 2function getNextAvailableFileName(folder) { 3 var fileNameBase = "file"; 4 var fileExtension = ".pdf"; 5 var counter = 1; 6 7 // フォルダ内のファイルを取得 8 var files = folder.getFiles(); 9 10 // 連番のファイル名が存在するか確認 11 while (files.hasNext()) { 12 var file = files.next(); 13 var existingFileName = file.getName(); 14 var expectedFileName = fileNameBase + counter + fileExtension; 15 16 // 連番が存在する場合、カウンターを増やして再試行 17 if (existingFileName === expectedFileName) { 18 counter++; 19 } else { 20 // 連番が存在しない場合、そのファイル名を使用 21 return expectedFileName; 22 } 23 } 24 25 // すべての連番が使用されている場合、最後の連番を使用 26 return fileNameBase + counter + fileExtension; 27} 28 29// 5桁の乱数を生成して、重複がないか確認する関数 30function generateUniqueRandomNumber(existingNumbers) { 31 var newNumber; 32 do { 33 newNumber = Math.floor(10000 + Math.random() * 90000); 34 } while (existingNumbers.indexOf(newNumber) !== -1); 35 return newNumber; 36} 37 38function sendMail(emailAdress,name,birthday,sex, pdfId) { 39 if(sex=="male"){var Sex = "男性"}else {var Sex = "女性"} 40 const recipient = 'sumaishare@gmail.com';        //送信先のメールアドレス 41 const subject = '身分証確認用メール';       //件名 42 const recipientName = name;   //送信先の担当者名 43 const body = `☆新規ユーザー☆\n氏名:${recipientName}\n生年月日:${birthday}\n性別:${Sex}\nemail:${emailAdress}\n` 44 + '\n\n*身分確認後は許諾用URLより手続きを行ってください。*\n'; 45 //本文 46 47 //添付ファイルの取得 48 let attachmentFile = DriveApp.getFileById(pdfId).getBlob(); 49 50 let options = { 51 attachments :attachmentFile, 52 name: 'メール担当 ○○' 53 }; 54 GmailApp.sendEmail(recipient, subject, body, options); 55} 56 57function doPost(e) { 58 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 59 ss1 = new Ssheet(ssID1); 60 61 62 var columnIndex = 2; // 例としてA列を指定 63 var data = sheet.getRange(1, columnIndex, sheet.getLastRow(), 2).getValues(); 64 var rowData = []; 65 rowData.push(new Date()); 66 // 5桁の乱数を生成してセルに代入 67 var randomNumber=0; 68 for (var i = 0; i < data.length; i++) { 69 randomNumber = generateUniqueRandomNumber(data); 70 } 71 72//ほかの質問のセル追加は略 73 74 var blob = Utilities.newBlob(e.postData.getDataAsString(), e.postData.getContentType(), e.parameter.fileUpload); 75 // ファイルを保存するGoogle Driveのフォルダ 76 var folder = DriveApp.getFolderById("1hKsF5Z-nFhq0bQk6PTZxStaAfk4yFmRY"); 77 78 // フォルダ内で使用可能なファイル名を取得 79 var fileName = getNextAvailableFileName(folder); 80 81 // ファイル名を指定してファイルを保存 82 var file = folder.createFile(blob.setName(fileName)); 83 84 // 保存したファイルのURLを取得 85 var fileUrl = file.getUrl(); 86 var fileId = file.getId(); 87 rowData.push(fileUrl); 88 rowData.push(e.parameter.other); 89 sendMail(e.parameter.email,e.parameter.name,e.parameter.birthday,e.parameter.contact3, fileId); 90 91 92 sheet.appendRow(rowData); 93 return 0; 94 95 96 97}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/12/17 00:54

htmlから、アップロードに関する部分の情報が故意に省略されているため、現状のままではおそらく誰も回答できないでしょう。 本文を編集して全部のコードを追記いただけますか?
katokato123456

2023/12/17 07:47

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
guest

回答1

0

form に action の URL を指定している場合にファイルを送信するには、form の enctype に multipart/form-data の指定が必要です。

enctype を省略するとデフォルトで application/x-www-form-urlencoded になるので、ファイルを送信しても中身が送られず、質問にあるような変な文字列が送られるだけです。

しかし GAS の web アプリでは、 enctype に multipart/form-data を指定するだけではファイルを正常に送ることはできません。(仕様)
GASでやるには、HTTPリクエストをごりごり書く必要があります。

それは面倒なので、submitイベントを捕捉して、その中でbase64にエンコードして、fetch等で送るのが楽。
質問のコードでは、GASで受け取ってデータ加工してるので google.script.runが使える。

なお、仮に省略されてる部分に起因するバグや要件の違いがあっても対応できませんので、御自分で調整してください。

html

1<div class="input"> 2 <form> 3 4 <!--ほかの質問は略--> 5 6 <div style="height: 20px;"></div> 7 <!--No.3--> 8 <legend style="text-align: start;">身分証明書 ~長くて見にくいので略~ 9 </legend> 10 <input id="file-upload" type="file" name="fileUpload" accept=".pdf" /> 11 12 <div style="height: 20px;"></div> 13 <div style="width: 100%;text-align: center;"> 14 <input id="playButton" class="btn" type="submit" value="送信"> 15 </div> 16 </form> 17 <audio id="Audio" src="btn.mp3"></audio> 18 <iframe name="audioFrame" style="display:none;"></iframe> 19</div> 20 21<script> 22 const audio = document.getElementById("Audio"); 23 const playButton = document.getElementById("playButton"); 24 const form = document.querySelectorAll('form')[0]; 25 26 // submitイベントを捕捉 27 form.addEventListener('submit', function(event) { 28 const file = document.getElementById('file-upload').files[0]; 29 const reader = new FileReader(); 30 const formData = new FormData(this); 31 // ファイル読込が完了したら送信 32 reader.addEventListener('load', (e) => { 33 const base64EncodedFileContent = reader.result.split(',')[1]; 34 google.script.run.processFormData( 35 base64EncodedFileContent, JSON.stringify([...formData]) 36 ); 37 audio.play(); 38 alert("コメントを送信しました。"); 39 }, false); 40 if (file) { 41 // ファイルを読み込む 42 reader.readAsDataURL(file); 43 } else { 44 alert("ファイルが指定されていません"); 45 event.preventDefault(); 46 } 47 }); 48</script>

js

1 2// フォルダ内で使用可能なファイル名を取得する関数 3function getNextAvailableFileName(folder) { 4 // 同名のファイルを作ってしまう論理バグがあるが、ここでは本題ではないので修正は省略 5} 6 7..他の関数は変える必要がないので略.. 8 9function doPost(e) { 10 // 中身全削除。 11 return 0; 12} 13 14// ファイル生成、フォーム内容加工の関数。 15function processFormData(base64EncodedFileContent, formdata) { 16 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 17 ss1 = new Ssheet(ssID1); // 謎 18 19 var columnIndex = 2; // 例としてA列を指定 20 var data = sheet.getRange(1, columnIndex, sheet.getLastRow(), 2).getValues(); 21 var rowData = []; 22 rowData.push(new Date()); 23 // 5桁の乱数を生成してセルに代入 24 var randomNumber = 0; 25 for (var i = 0; i < data.length; i++) { 26 randomNumber = generateUniqueRandomNumber(data); 27 } 28 29 //ほかの質問のセル追加は略 30 const e = {parameter: Object.fromEntries(JSON.parse(formdata))}; 31 var blob = Utilities.newBlob(Utilities.base64Decode(base64EncodedFileContent), 'application/pdf', fileName); 32 // ファイルを保存するGoogle Driveのフォルダ 33 var folder = DriveApp.getFolderById("1hKsF5Z-nFhq0bQk6PTZxStaAfk4yFmRY"); 34 var fileName = getNextAvailableFileName(folder); 35 // ファイル名を指定してファイルを保存 36 var file = folder.createFile(blob.setName(fileName)); 37 var fileUrl = file.getUrl(); 38 var fileId = file.getId(); 39 rowData.push(fileUrl); 40 rowData.push(e.parameter.other); 41 sendMail(e.parameter.email, e.parameter.name, e.parameter.birthday, e.parameter.contact3, fileId); 42 sheet.appendRow(rowData); 43 44} 45 46 47 48

投稿2023/12/18 15:51

編集2023/12/18 16:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問