GASのフォーム送信(doGet, doPost)でForbiddenになる問題を解決

こんにちは、フリーランスエンジニアの太田雅昭です。

狭い部屋でクーラーが効きすぎるので、扇風機の前に保冷剤を置いてパソコンを叩いてます。

GASのdoGetで生成したフォームで送信するもForbidden

GASのdoGetでテンプレートファイルを読み込み、フォームを生成したのはいいものの、そこから送信するとなぜかForbiddenに。

過去にも経験したはずなのに、他の言語を叩いているうちについ忘れてしまうプログラマの性。

GPT4先生にいくら聞いても、解決に至らないこの問題。

結局Google先生に聞いた方が早かったこの問題。(2023/08/06現在、海外ではGoogleもAI搭載されているとか。TikTok情報)

以下に解決方法を書かせていただきます。

犯人はiFrame

GASはテンプレートをそのまま出力するのではなく、iFrameの中に書き込んでいます。

そのためそのiFrameの中から外のURLに送信しようとするので、Forbiddenになるようです。

解決策としましては、以下のように target に “_top” を設定することです。

function doGet(e) {
    const q = e.parameter.q;

    const template = HtmlService.createTemplateFromFile('index');
    template.self=ScriptApp.getService().getUrl();
    
    if (q) {
        const data = request(q);
        template.json = JSON.stringify(data, null, 4);
    }
    return template.evaluate();
}
<form action="<?= self ?>" method="get" target="_top">
    <input type="text" name="q" placeholder="検索">
    <button type="submit">検索</button>
</form>

ところで業務スーパーのレモネードベースが美味しすぎて、毎日飲んでます。

カルピスのように水で薄めて飲むので、ゴミも少ないし最高です。