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

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

ただいまの
回答率

88.76%

自分のみ権限で、Google Apps ScriptでのdoPost()を利用した場合に、Requestを受け取る方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,609

Meganezaru

score 697

Google Spreadsheetsにアクセスするための簡易APIサーバーのようなものを簡単に作れるということで、Google Apps Scriptのウェブアプリを試してみましたが、どうも意図するように動かないというか、もやもやした部分が出てきました。

公式のリファレンスも含め、いろいろ情報を探してみましたが、スキルが低いせいか、希望する情報にたどり着けなかったので、よろしければご教授ください。

 CORSには未対応?

外部サーバーに配置したフロントエンドから、postしようとしたところ、CORSヘッダー関連のエラーになりました。

とりあえず、fetchのモードを"no-cors"にすることで、postに関する動作(特定セル情報の更新)はできましたが、そのせいでresponseが得られないので、終了判定ができない状態です。

そもそも、CORSも理解できていないかも・・・ですが・・・、GASに特定の外部オリジンを信用させるための設定をすることはできるのでしょうか?

 doGet()でフロントエンドを配信することが前提?

だとすると、プロジェクトに特定の拡張子しか収められないことに、まぁまぁ違和感があります・・・笑
HTMLのみ配信し、他のリソースは外部サーバーから取得するのか、拡張子を変更したりして、むりやりプロジェクトに含めるという方法しかないのでしょうか?

どちらにしても、フロントエンドのフレームワークを利用したりする場合は、面倒な作業が付きまとう気がします・・・

 認証のメカニズムは?

ウェブアプリケーションとして導入、する際に、アプリケーションにアクセスできるユーザーを「自分だけ」にした場合、期待する動作として、該当するSpreadsheet(もしくはScript自体?)の所有者のみ実行できることだと解釈しています。

ただ、その場合、所有者であることを、フロントエンド側から、どうやって示せば良いのかはっきりとわかりません。
なんとなく、Chromeであれば、ログインユーザーであったり、他のブラウザであれば、Googleへのログインであったり、するようなのですが・・・
ログインしても、動く時と動かない時があり、その原因がはっきりしませんでした。

そもそも、どんな仕組みで認証することになるのでしょうか?(OAuthあたり、じゃないかな・・・ぐらいの、知識・・・です・・・泣)

私自身の知識が、たくさん足りないことが原因ではありますが、とくに認証周りなどは、知識を得るための入り口もわかっていない状態だったりします(^_^;)
ここを勉強すれば良いとか、この情報を読んでみて、とかでも助かりますので、どうかアドバイスをいただければありがたいです。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

なにを参考にどういうものを作ったのか全くわからないのですが、説明はしていただけないのでしょうか。
多分doGetdoPostでできないとおっしゃっておられるとエスパーしました。

こういうのを参考になさると多少はやりたいことに近づけるのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/17 00:09

    エスパーありがとうございます(^_^)

    やりたいことは、中途半端な感じですが、出来ています。

    ・doGet()で、セル情報の取得(全員アクセス可)
    ・doPost()で、セルへの書き込み(自分のみ)

    中途半端になっている部分が、質問させてもらった部分で、

    ・doPost()の時、no-corsモードじゃないと、書き込めない
    ・自分からのアクセスであることを明示する仕組みが理解できない

    ということです。

    キャンセル

check解決した方法

-1

いろいろ調べてみましたが、最終的にはdoPost()は希望通りに使えない・・・だろう・・・という結論に至りました。

CORSの回避(Post時のPreflightで送られるoptionの抑止)は、RequestHeaderのContent-Typeをtext/plainにすることでできました。

認証情報は、Cookieに保存されていて、fetchのoption、credentials: "include"を指定することで、Postに載せることができました。(これは、実施済みでしたが、仕組みを知らずに使ってましたw)

ただし・・・上記二つを実施してPostをしても、Spreadsheetへの書き込みはできますが、Responseがブラウザでブロックされます。結果的にはno-corsと同じですね・・・

ResponseHeaderのAccess-Control-Allow-Originが*で戻ってくるのですが、
credentialsをincludeにした場合は、*を許可しないそうです・・・

GoogleCloudPlatformのプロジェクトに設定されている認証情報に、Originを設定できるっぽい箇所(承認済みの JavaScript 生成元)があるのですが、Google Apps Scriptが自動で追加したものでは、変更の権限がないようでOriginを追加することができませんでした。

この時点で、Googleがサービスとして明らかに抑止していると感じたので、これ以上調査するのをやめました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る