• 締切済み

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でその出力したファイルを指定するしかない?

  • google apps scriptでメール送信

    google apps scriptでスプレッドシートを添付ファイルで送る方法をお教えください。 google apps scriptで SpreadsheetApp.getActiveSheet(); として取得しセルにデータを書き込んだスプレッドシートをEメール発信したいです。 sendEmail(送付先アドレス, タイトル, 内容, options); とすると思いますが、optionsの書き方がわかりません。 よろしくお願いします。 2012 Sep. 25.

  • フォームから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>

  • GoogleAppsScriptのトリガ

    よろしくお願いします。 スプレッドシートにWEBクエリで任意のサイトから数値をコピーし、 独自計算してセル("D2:D6")に値を出しています。 これをメールグループにスクリプトトリガで毎日定時に送信したいのですが、 最初は意図通り数値が送信されるのですが、次回から #VALUE! #VALUE! #VALUE! #VALUE! #VALUE! と出てしまいます。 自分の力量を超えておりまして、どうかお知恵をお貸しください。 function myFunction() { var mySubject = "件名"; var mySheet = SpreadsheetApp.getActiveSheet(); var myrange = mySheet.getRange("D2:D6"); var myBody = myrange.getValues(); var context = myBody.join("\n"); Logger.log(context); var myGroup = ContactsApp.getContactGroup("グループ"); var myContacts = myGroup.getContacts(); var myCount = myContacts.length; for (i = 0; i < myCount; i++) { var mailBCC = myContacts[i].getEmails()[0].getAddress(); GmailApp.sendEmail(mailBCC, mySubject, context ); } } ※Google Apps Scriptのカテゴリがなくこちらで質問させていただきましたが、検討違いでしたら申し訳ございません。

  • 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のコードから)確認する方法はあるのでしょうか。

専門家に質問してみよう