実現したいこと
HTMLで入力したデータ(inputやradio)をGASに送信してスプレッドシートに書き込みたいです。
発生している問題・分からないこと
JavascriptからGASに送信するときに以下のエラーコードが発生します
エラーメッセージ
error
1Access to fetch at 'https://script.google.com/macros/s/AKf.../exec' from origin 'http://xxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
該当のソースコード
Javascript
1document.addEventListener('DOMContentLoaded', function () { 2 function collectAnswers() { 3 const answers = {}; 4 5 document.querySelectorAll('#page-1 input[type="text"]').forEach((input, i) => { 6 answers[`yomi${i + 1}`] = input.value.trim(); 7 }); 8 9 answers['jp_01'] = document.querySelector('input[name="jp"]')?.value.trim() || ''; 10 answers['jp_02'] = document.querySelector('input[name="jp1"]:checked')?.value || ''; 11 answers['choice'] = document.querySelector('input[name="choice1"]:checked')?.value || ''; 12 answers['jp5'] = document.querySelector('input[name="jp5"]')?.value.trim() || ''; 13 answers['contact'] = document.querySelector('input[name="contact1"]:checked')?.value || ''; 14 answers['math_01'] = document.querySelector('input[name="math_01"]:checked')?.value || ''; 15 answers['math_02'] = document.querySelector('input[name="math_021"]:checked')?.value || ''; 16 answers['math_03'] = document.querySelector('input[name="math_031"]:checked')?.value || ''; 17 answers['math_041'] = document.querySelector('input[name="math_041"]')?.value.trim() || ''; 18 answers['math_042'] = document.querySelector('input[name="math_042"]')?.value.trim() || ''; 19 answers['math_043'] = document.querySelector('input[name="math_043"]')?.value.trim() || ''; 20 21 return answers; 22 } 23 24 async function submitToGAS(answers) { 25 const form = new FormData(); 26 for (const key in answers) { 27 form.append(key, answers[key]); 28 } 29 30 try { 31 const response = await fetch('https://script.google.com/macros/s/AKf.../exec', { 32 method: 'POST', 33 body: form, 34 mode:"cors", 35 headers: { 36 'Content-Type': 'application/json' 37 } 38 }); 39 40 if (response.ok) { 41 alert('送信が完了しました。ありがとうございました!'); 42 } else { 43 const text = await response.text(); 44 console.error('送信失敗:', response.status, text); 45 alert('送信に失敗しました。もう一度お試しください。'); 46 } 47 } catch (error) { 48 console.error('fetchエラー:', error); 49 alert('送信に失敗しました。もう一度お試しください。'); 50 } 51 } 52 53 const hoverButton = document.querySelector('#page-4 .button[data-role="submit-button"]'); 54 if (hoverButton) { 55 hoverButton.addEventListener('click', () => { 56 const answers = collectAnswers(); 57 submitToGAS(answers); 58 }); 59 } else { 60 console.warn("送信ボタンが見つかりませんでした。"); 61 } 62}); 63
GAS
1function doPost(e) { 2 const sheet = SpreadsheetApp.openById('ID').getSheetByName("スプレッドシートの名前"); 3 4 sheet.appendRow([ 5 new Date(), 6 e.parameter.yomi1, 7 e.parameter.yomi2, 8 e.parameter.jp_01, 9 e.parameter.jp_02, 10 e.parameter.choice, 11 e.parameter.jp5, 12 e.parameter.contact, 13 e.parameter.math_01, 14 e.parameter.math_02, 15 e.parameter.math_03, 16 e.parameter.math_041, 17 e.parameter.math_042, 18 e.parameter.math_043 19 ]); 20 21 return ContentService.createTextOutput("送信成功") 22 .setMimeType(ContentService.MimeType.TEXT) 23 .setHeader("Access-Control-Allow-Origin", "*"); 24} 25
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
'Content-Type': 'application/json'を色々変えてみましたが、エラーの内容は変わらず、GASもコードを変更するごとに再デプロイしてアクセスできるユーザーを全員に常にしています。
補足
自分はまだ実践も未経験かつほぼ独学で進めているので、コードが分かりずらかったりすると思います。申し訳ございません。
また、ここに質問する前に調べたりchatGPTに質問していますが、解決されず...といった状態です。初心者ですが、どうかよろしくお願いします。

あなたの回答
tips
プレビュー