• 締切済み

CORSに引っかかってしまいます。

post送信側のスクリプト javascript:(function(){ var data = { field1: 'value1', field2: 'value2', field3: 'value3' }; var xhr = new XMLHttpRequest(); xhr.open("POST", "スクリプトのurl", true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify(data)); })(); gas側のスクリプト // スクリプトのトリガーを設定する場合は、必要に応じてトリガーを追加することもできます。 function doPost(e) { var sheet = SpreadsheetApp.openById('YOUR_SPREADSHEET_ID').getActiveSheet(); var data = JSON.parse(e.postData.contents); // データをスプレッドシートに書き込む sheet.appendRow([data.field1, data.field2, data.field3]); // 必要なフィールドに合わせて変更 return ContentService.createTextOutput('Success').setMimeType(ContentService.MimeType.TEXT); } スプレッドシートに書き込みたいのですがhttps://script.google.com/以外から実行すると書き込めません。どうすれば外部サイトから書き込めるでしょうか?

みんなの回答

回答No.1

外部サイトからGoogle Apps Script (GAS) を実行して、データをスプレッドシートに書き込むにはいくつかのステップを踏む必要があります。まず、GASでWebアプリケーションとしてスクリプトをデプロイし、適切なアクセス権を設定する必要があります。それでは具体的な手順を説明しましょう。 1. アクセス権の設定: GAS のエディタで、デプロイをクリックし、新しいデプロイを選択します。次に、デプロイタイプとして「Webアプリ」を選択し、アプリケーションにアクセスすることができるユーザー(自分のみ、自分の組織のユーザー、または誰でもアクセス可能)を選択します。最後にデプロイを実行すると、WebアプリのURLが生成されます。 2. CORS(Cross-Origin Resource Sharing)問題の回避: ブラウザのセキュリティポリシーにより、異なるオリジンのリソースに対するリクエストは制限されています。この問題を回避するためには、サーバー側(GAS側)で適切なヘッダーをレスポンスに含めて返す必要があります。GAS の `doPost` 関数内で、以下のようなコードを追加して、CORS要求に対応します。 ```javascript function doPost(e) { var output = ContentService.createTextOutput(); // CORSを許可する output.setMimeType(ContentService.MimeType.JSON); output.setContent(JSON.stringify({status: 'success'})); output.setHeader('Access-Control-Allow-Origin', '*'); output.setHeader('Access-Control-Allow-Methods', 'GET, POST'); // ここにデータを処理するコードを追加します // ... return output; } ``` 3. セキュリティリスクに注意: 外部から簡単にアクセスできるようにした場合、不正なアクセスに対するリスクも高まりますので、適切な認証メカニズムを設けることをお勧めします(たとえば、APIキーやトークン認証など)。 4. エラーハンドリング: エラーが発生した場合に、適切なエラーメッセージを返すようにし、デバッグが容易になるようにします。 上記のポイントを踏まえて、あなたのGASと連携し、スプレッドシートに書き込む処理を行うには、適切な権限の設定、CORS対応、セキュリティ強化を含めた総合的な対応が必要です。これにより外部サイトから安全にデータを送信し、スプレッドシートに書き込むことができるでしょう。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • jquery PHP 値 ajax

    失礼します。現在jqueryで作成した2次元配列をPHP側に渡したいのですが上手くいきません。 jquery側のコンソールで確認した際にはsuccessの処理が行われ配列の中身がjson形式で表示されるのですが、その内容をPHP側で確認しようとするとNULLが返ってきてしまいます。 何卒ご教授よろしくお願いいたします。 html側 $(function(){ // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換 send_data= JSON.stringify(data); // 送信処理 $.ajax({ url: "ajax.php", // 送信先のPHP type: "POST", // POSTで送る contentType: "Content-Type: application/json; charset=UTF-8", //必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。 // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。 data:send_data //JSON形式の送信データ }).success(function(data, status, xhr) { // 通信成功時の処理 console.log("success"); console.log("data ="+data); console.log("status ="+status); console.log("xhr ="+xhr); }).error(function(xhr, status, error) { // 通信失敗時の処理 console.log("error"); }).complete(function(xhr, status) { // 通信完了時の処理 console.log("fin"); }); }) }) PHP側 二通り試してみました。 <?php //php://inputはPOSTの生データを取得できる $json = file_get_contents("php://input"); //JSON形式データをPHPの配列型に変換 $data = json_decode($json); var_dump($data) ; //POSTできたデータを格納 $hoge = $_POST['data']; var_dump($hoge);

    • ベストアンサー
    • AJAX
  • $.getJSONにJSON.stringifyを

    $.getJSONに、JSON.stringifyした結果を指定したいのですが、どうすればよいでしょうか? ■現状 ・コンソールにJSONは出力されているのですが、$.getJSONでこのファイルを指定しても、画面真っ白です ▼index.html <script type="text/javascript" src="hoge.json"></script> <script type="text/javascript"> $.getJSON('hoge.json', function(data) { ▼hoge.json var obj =([ [略], ]); var json_text = JSON.stringify(obj); // テスト出力 console.log(json_text); ■質問 ・$.getJSONにこの出力結果(json_text)を指定するためには、どうすれば良いでしょうか? ・一旦ファイル出力しなければいけないのでしょうか? ・どうやるのでしょうか? ・AJAXでサーバ側へデータを渡してファイル出力した後、$.getJSONでその出力したファイルを指定するしかない?

  • フォームからjQuery,jQuery.jsonを使ってJSONを作っ

    フォームからjQuery,jQuery.jsonを使ってJSONを作ってPHPで表示したい。 こんばんは。2、3日ずっと悩んでて解決しないので助けてください。 jQuery,jQuery.jsonを使ってJSONを作成しています。 クリックイベントに var form = $("#sform"); var json = $(form.serializeArray()); var strJson = $.toJSON(json); という形をとって $.ajax({ url : "request.php", type : "post", data : strJson, success: function(request){ $('#result').html(request); } }); で送っています。 ただPHP側で var_dump($_POST); を行ってもArray ( ) と表示されます。 firebugで見たところpostに入っているデータは以下の通りです。 {"0":{"name":"date","value":"2010/09/15"},"1":{"name":"type","value":"new"},"2":{"name":"bin[]","value":"2"},"3":{"name":"bin[]","value":"3"},"length":4} var_dumpで表示できないのはなぜでしょうか? 上記で変数json のまま送るとオブジェクトとして送れてvar_dump でも表示できます。 ただ今はjson の勉強をしているので、できればなぜこうなっているのかを理解したいです。 基本的なところで勉強不足かもしれませんが、何かアドバイスなど頂けると嬉しいです。 よろしくお願いします。

  • Google MapsのKMLをJSONで取得したい。

    Google MapsのKMLをJSONで取得したい。 Google Mapsで作成したマイマップのKMLを見るとURLが書かれています。 このURLの末尾を「&output=kml」→「&output=json」 と変更するとJSONで取得できると思うのですが、 実行するとstatus=0となっていまいます。 HTTPヘッダを見る限り200なので取得出来ているようなのですが・・・ なぜでしょうか?教えてください。 === var jsonUrl = 'url' var xhr = new XMLHttpRequest(); xhr.open("GET", jsonUrl, true); xhr.onreadystatechange = function() { if (xhr.readState ==4 && xhr.status == 200){ var jresult = document.getElementById("json_panel"); jresult.innerHTML += xhr.responseTEXT; } else { alert (xhr.statusTEXT); } } xhr.send();

  • HTML内部のJavascriptの記述について

    webに遅延情報を記載するHTMLを作成しているのですがJavascriptの結果が表示されません当方まだ学習中であり初歩的なミスなどあるかもしれませんがよろしくお願いいたします。 <!DOCTYPE html> <html> <head> </head> <body> <h1>遅延情報</h1> <script language="JavaScript"> function (){ var json = JSON.parse(UrlFetchApp.fetch("https://rti-giken.jp/fhc/api/train_tetsudo/delay.json").getContentText()); var data1 = [ {nam:"豊肥本線",compan:"JR九州"},   {nam:"横浜線",compan:"JR西日本"}, ] var lind =""; data1.forEach( function( value ) { var nam=value.nam; var compan=value.compan; json.forEach( function( value ) { var name=value.name; var company=value.company; if(nam === name && compan === company){ lind='周辺の鉄道が遅延しています'; } }); }); if(!lind) { lind='遅延情報はありません'; } document.write(lind); } </script> </body> </html>

  • html内に記述するJavascriptについて

    webに遅延情報を記載するHTMLを作成しているのですがJavascriptの結果が表示されません当方まだ学習中であり初歩的なミスなどあるかもしれませんがよろしくお願いいたします。 <!DOCTYPE html> <html> <head> </head> <body> <h1>遅延情報</h1> <script language="JavaScript"> function (lind){ var json = JSON.parse(UrlFetchApp.fetch("https://rti-giken.jp/fhc/api/train_tetsudo/delay.json").getContentText()); var data1 = [ {nam:"豊肥本線",compan:"JR九州"},   {nam:"横浜線",compan:"JR西日本"}, ] var lind =""; data1.forEach( function( value ) { var nam=value.nam; var compan=value.compan; json.forEach( function( value ) { var name=value.name; var company=value.company; if(nam === name && compan === company){ lind='周辺の鉄道が遅延しています'; } }); }); if(!lind) { lind='遅延情報はありません'; } document.getElementById(“text”).innerHTML = lind; } </script> <div id=”text”></div> </body> </html>

  • 【2】同一スプレッドシート内で複数GASを使用

    以前、「同一スプレッドシート内で、複数GASを使用したい」のタイトルで投稿し、回答を頂きました。 https://okwave.jp/qa/q9537222.html それを参考に、 ●シート名を取得 function sheetname() { return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName(); } ●必ず一番左のタブを開く(https://kitaney-google.blogspot.com/2015/11/google-url.html) function sample_activate_first_sheet_2(){  SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].activate(); } の2つのGASを以下のように記述しました --------------------- sheetname(); sample_activate_first_sheet_2(); function sheetname() { return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName(); } function sample_activate_first_sheet_2(){  SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].activate(); } ------------------------------------ すると、「必ず一番左のタブを開く」は動作したのですが、 「シート名を取得」がうまく表示されませんでした。 この記述方法ではダメなんでしょうか。 超初心者なので具体的に教えて頂けると嬉しいです。

  • オブジェクトの内容を確認する方法

    JavaScriptでオブジェクトの中身を確かめたいときに、 JSON.stringifyや下の関数のようなやり方がありますが、 var showObj = function(obj) { var props = ""; for (var prop in obj){ props += prop + "=" + obj[prop] + "\n"; } return props } JSON.stringify(Math)//{} showObj(Math)// となり、Mathオブジェクトの中身は確認できませんでした。 これはどういった理由によるものなのでしょうか。 また、(JavaScriptのコードから)確認する方法はあるのでしょうか。

  • 2つのjavascriptを組み合わせたい

    フォームメール用の2つのjavascriptがあります。 ●2重送信防止とデータ送信後指定ページへ遷移するjavascript ●テキストボックスが空欄だった時にアラートを表示するjavascript の2つです。 この2つを組み合わせようとしたのですが、うまく動きません。 ご指導いただきたくお願いいたします。 *************************************************** 【●2重送信防止とデータ送信後指定ページへ遷移するjavascript】【動きます】 送信ボタン押下後、2重送信を防止しながら、データ送信後は「location.href = "finish.html"」でfinish.htmlを表示します。 <script type="text/javascript" src="js/jquery.js"></script> <script> jQuery(function($) { $('#form1').submit(function(event) { // HTML送信キャンセル event.preventDefault(); //フォーム要素取得 var $form = $(this); // 送信ボタンを取得 // (後で使う: 二重送信防止) var $button = $form.find('button'); // 送信 $.ajax({ url: $form.attr('action'), type: $form.attr('method'), data: $form.serialize() + '&delay=1', timeout: 10000, // 送信前 beforeSend: function(xhr, settings) { // ボタン無効二重送信防止 $button.attr('disabled', true); }, // 応答後 complete: function(xhr, textStatus) { // ボタン有効再送信許可 $button.attr('disabled', false); }, // 通信成功処理 success: function(result, textStatus, xhr) { // 入力値初期化 $form[0].reset(); location.href = "finish.html"; }, // 通信失敗処理 error: function(xhr, textStatus, error) { alert('retry');} }); }); }); </script> <form name="form1" id="form1" method="POST" name="form1" action="insert.php"> <input type="text" name="tel" value="" /> <input type="text" name="fax" value="" /> <input type="submit" value="送信A"> </form> *************************************************** 【●テキストボックスが空欄だった時にアラートを表示するjavascript】【動きます】 テキストボックスが空欄だったらアラートを表示します。 <script> function check3() {   var tel3 = document.form1.tel.value;   var fax3 = document.form1.fax.value;   var isValid = true;   if (!tel3) {     alert("電話未入力");     isValid = false;   }   if (!fax3) {     alert("FAX未入力");     isValid = false;   }   if (!isValid) {     return;   }   document.form1.submit(); } </script> <form name="form1" id="form1" method="POST" name="form1" action="insert.php"> <input type="text" name="tel" value="" /> <input type="text" name="fax" value="" /> <input type="submit" value="送信B" onclick="check3();"> </form> *************************************************** 【上記の2つを組み合わせてみました。】【動きません】 テキストボックスが空欄だったらアラートを表示しながら2重ボタン排除&finish.htmlに遷移というものです。 【結果】 「問題なく動くjavascript」2つを単純に組み合わせただけなのですが、 finish.htmlに遷移せずinsert.phpが表示されます。ご指導宜しくお願いします。 <script type="text/javascript" src="js/jquery.js"></script> <script> jQuery(function($) { $('#form1').submit(function(event) { event.preventDefault(); var $form = $(this); var $button = $form.find('button'); $.ajax({ url: $form.attr('action'), type: $form.attr('method'), data: $form.serialize() + '&delay=1', timeout: 10000, beforeSend: function(xhr, settings) { $button.attr('disabled', true); }, complete: function(xhr, textStatus) { $button.attr('disabled', false); }, success: function(result, textStatus, xhr) { $form[0].reset(); location.href = "finish.html"; }, error: function(xhr, textStatus, error) { alert('retry');} }); }); }); </script> <script> function check3() {   var tel3 = document.form1.tel.value;   var fax3 = document.form1.fax.value;   var isValid = true;   if (!tel3) {     alert("電話未入力");     isValid = false;   }   if (!fax3) {     alert("FAX未入力");     isValid = false;   }   if (!isValid) {     return;   }   document.form1.submit(); } </script> <form name="form1" id="form1" method="POST" name="form1" action="insert.php"> <input type="text" name="tel" value="" /> <input type="text" name="fax" value="" /> <input type="submit" value="送信B" onclick="check3();"> </form>

  • undef datalistがundefinedに

    javascript datalistがundef datalistがundefinedになります。 var datalist = { data3: "hoge3", } // str=[]; var a = { data1: "hoge1", data2: "hoge2" } function SaveDataToLocalStorage(datalist) { var a = []; a.push(JSON.parse(localStorage.getItem('session'))); localStorage.setItem('session', JSON.stringify(a)); // Parse the serialized data back into an aray of objects a = JSON.parse(localStorage.getItem('session')) || []; // Push the new data (whether it be an object or anything else) onto the array alert(datalist); a.push(datalist); console.log(datalist); // Alert the array value alert(a+"datalist"); // Should be something like [Object array] // Re-serialize the array back into a string and store it in localStorage localStorage.setItem('session', JSON.stringify(a)); }