🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

Q&A

解決済

1回答

8803閲覧

GASのdoPostでdoGetと同じように結果をreturnできない

nkigs

総合スコア15

Google Apps Script

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

0グッド

1クリップ

投稿2019/09/15 04:55

編集2019/09/15 05:26

前提・実現したいこと

GoogleAppsScript(GAS)でdoGet関数とdoPost関数の戻り値のテストをしています。
具体的には以下のコードです。

function doGet(e){ return ContentService.createTextOutput("Hello World"); } function doPost(e){ return ContentService.createTextOutput("Hello World"); }

上記doGetは正常に結果(Hello World)が得られますが、doPostでは期待した結果が得られません。

発生している問題・エラーメッセージ

正常に動作したdoGet関数の結果

以下の結果をPOSTでも得られることを想定していましたが叶いませんでした。

呼び出し

$ curl -X GET -L https://script.google.com/macros/s/<ScriptID>/exec

結果

Hello World

doPost関数の結果

呼び出し

curl -X POST -L https://script.google.com/macros/s/<ScriptId>/exec

結果

<!DOCTYPE html><html lang="ja"><head><meta name="description" content="ウェブ ワープロ、プレゼンテーション、スプレッドシート"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"><link rel="shortcut icon" href="//ssl.gstatic.com/docs/common/drive_favicon1.ico"><title>Google ドライブ -- ページが見つかりません</title><link href="//fonts.googleapis.com/css?family=Product+Sans" rel="stylesheet" type="text/css"><style>/* Copyright 2019 Google Inc. All Rights Reserved. */ .goog-inline-block{position:relative;display:-moz-inline-box;display:inline-block}* html .goog-inline-block{display:inline}*:first-child+html .goog-inline-block{display:inline}#drive-logo{margin:18px 0;position:absolute;white-space:nowrap}.docs-drivelogo-img{background-image:url('//ssl.gstatic.com/images/branding/googlelogo/1x/googlelogo_color_116x41dp.png');background-size:116px 41px;display:inline-block;height:41px;vertical-align:bottom;width:116px}.docs-drivelogo-text{color:#000;display:inline-block;opacity:0.54;text-decoration:none;font-family:'Product Sans',Arial,Helvetica,sans-serif;font-size:32px;text-rendering:optimizeLegibility;position:relative;top:-6px;left:-7px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (-webkit-min-device-pixel-ratio:1.5),(min-resolution:144dpi){.docs-drivelogo-img{background-image:url('//ssl.gstatic.com/images/branding/googlelogo/2x/googlelogo_color_116x41dp.png')}}</style><style type="text/css">body {background-color: #fff; font-family: Arial,sans-serif; font-size: 13px; margin: 0; padding: 0;}a, a:link, a:visited {color: #112ABB;}</style><style type="text/css">.errorMessage {font-size: 12pt; font-weight: bold; line-height: 150%;}</style></head><body><div id="outerContainer"><div id="innerContainer"><div style="position: absolute; top: -80px;"><div id="drive-logo"><a href="/"><span class="docs-drivelogo-img" title="Google ロゴ"></span><span class="docs-drivelogo-text">&nbsp;ドライブ</span></a></div></div><div align="center"><p class="errorMessage" style="padding-top: 50px">現在、ファイルを 開くことができません。</p><p>アドレスを確認して、もう一度試してください。</p><div style="background: #F0F6FF; border: 1px solid black; margin-top: 35px; padding: 10px 125px; width: 300px;"><p><strong>あれもこれも Google ドライブで</strong></p><p> Google ドライブにはドキュメントやスプレッドシート、プレゼンテーション などを簡単に作成、保存してオンラインで共有できるアプリが揃っています。</p><p>詳細は<a href="https://drive.google.com/start/apps">drive.google.com/start/apps</a>をご覧ください。</p></div></div></div></div></body><style>#outerContainer {margin: auto; max-width: 750px;}#innerContainer {margin-bottom: 20px; margin-left: 40px; margin-right: 40px; margin-top: 80px; position: relative;}</style></html>

試したこと

何もreturnしない場合の動作確認

ソースコード

function doGet(e){ return; } function doPost(e){ return; }

結果
両者は全く同じ結果になりました。

$ curl -X GET -L https://script.google.com/macros/s/<ScriptID>/exec <!DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>エラー</title><style type="text/css">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body style="margin:20px"><div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"></div><div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">スクリプトが完了しましたが、何も返されませんでした。</div></body></html> $ curl -X POST -L https://script.google.com/macros/s/<ScriptID>/exec <!DOCTYPE html><html><head><link rel="shortcut icon" href="//ssl.gstatic.com/docs/script/images/favicon.ico"><title>エラー</title><style type="text/css">body {background-color: #fff; margin: 0; padding: 0;}.errorMessage {font-family: Arial,sans-serif; font-size: 12pt; font-weight: bold; line-height: 150%; padding-top: 25px;}</style></head><body style="margin:20px"><div><img alt="Google Apps Script" src="//ssl.gstatic.com/docs/script/images/logo.png"></div><div style="text-align:center;font-family:monospace;margin:50px auto 0;max-width:600px">スクリプトが完了しましたが、何も返されませんでした。</div></body></html>

returnの直前に処理がある場合の結果

ソースコード

function doGet(e){ postSlack("これは動く?"); return ContentService.createTextOutput("Hello World"); } function doPost(e){ postSlack("これは動く?"); return ContentService.createTextOutput("Hello World"); }

postSlackはSlackに指定したテキストを送信するシンプルな関数です。
この関数の実行結果は本件に無関係と思えるので内容は割愛します。

結果はどちらもSlackへの送信は成功し、curlの結果に問題とされる結果からの変化はありませんでした。

以上から、本件の原因はdoPost内でContentServiceの結果を返してる事と予想しました。

function doPost(e){ // このreturnが悪さしてる return ContentService.createTextOutput("Hello World"); }

GAS仕様確認 

ContentServiceオブジェクトの仕様確認をしました。
公式リファレンス(https://developers.google.com/apps-script/guides/content)
上記ページを確認しました。
日本語に翻訳して目を通しましたが特にdoPostに関する注意書きは見つかりませんでした。

また、createTextOutput関数の戻り値も確認しました。
公式リファレンス(https://developers.google.com/apps-script/reference/content/text-output)
こちらも特に何か条件の記述はありませんでした。

現在の調査内容

色んな記事で本件と同じようなコードを利用しているがどれも正常に動作している。

「gas post return」
「gas post textoutput」
「gas post not found」

のようなワードで検索してもピンとくる結果が今の所得られていません。
GoogleDriveのページが見つかりませんってなんだ?何でGoogleDriveのページが関係あるんだ?
自分はスプレッドシート等に付随させる形でGASを動作させておらず、G Suite Developer Hubからプロジェクトを作成しているのでそのあたりが関係あるのかな?と思ってます。
いずれにせよGASのスクリプトのエラーではなくGoogleの環境(アカウント権限とか?)が問題な気がしますが、調査範囲が広すぎて困っています。

ご存じの方がおりましたら宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

function doPost(e){return ContentService.createTextOutput("Hello World");}からHello Worldを返すためのcurlコマンドは次のようになります。

bash

1curl -L -d "" https://script.google.com/macros/s/<ScriptId>/exec

ここで、https://script.google.com/macros/s/<ScriptId>/exec<ScriptId>はスクリプトIDではありませんのでご注意ください。

残念ながら、curlでは-X POSTを使って下記コマンドを実行すると、Web Apps上のfunction doPost(e){return ContentService.createTextOutput("Hello World");}からHello Worldは返されません。

bash

1curl -X POST -L https://script.google.com/macros/s/<ScriptId>/exec

原因は-X POST-Lを併用するとリダイレクト後もPOSTリクエストが実行されるのに対して、-d ""-Lを併用するとリダイレクト後にGETメソッドに切り替わる違いにあると考えられます。Web Appsの場合は後者に対してfunction doPost(e){return ContentService.createTextOutput("Hello World");}からHello Worldが返されるような仕様のようです。

参考

投稿2019/09/15 07:36

編集2019/09/15 07:38
kisojin

総合スコア899

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

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

nkigs

2019/09/15 09:04

無事求めた結果を得ることが出来ました。 検討違いの方向に向かってしまうところでした…。 もうちょっとcurlの仕様を調べておけばよかったです。 ご丁寧に回答してくださりありがとうございます。
kisojin

2019/09/20 00:29

ご返事ありがとうございます。無事解決したとのことで安心しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問