teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

JavaScript

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

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

Q&A

0回答

104閲覧

CORSエラーが解決しない

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

JavaScript

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

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

0グッド

1クリップ

投稿2025/06/10 09:13

0

1

実現したいこと

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に質問していますが、解決されず...といった状態です。初心者ですが、どうかよろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問