大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Google App Script 公開したけどアクセス401エラー

著者:津路高広
公開日:2021/10/15
最終更新日:2021/12/30
カテゴリー:技術情報

津路です。こんにちは。

今回は、Microsoft Computer Vision APIを利用して解析、取得したテキストを、スプレッドシートに書き込むプログラムを作ってみました。
と言っても、Qiitaの以下ページを再現しただけです。
画像認識APIでOCRアプリ

まず、Microsoft Azureのアカウントを作成して、Computer Visionサービスを検索し、サブスクリプションや名前などを設定して作成します。

自分のGoogleアカウントでスプレッドシートを作成して、ツールメニューからスクリプトエディタを起動します。

ページに掲載のスクリプトをそのまま書き込みます。
function doPost(e)
では、スクリプトがPostメソッドで呼ばれた際に、e引数からテキストを取り出して、スプレッドシートのA1セルに値を貼り付けます。

function recordText(text) {
  var sheet = SpreadsheetApp.openById("スプレッドシートのID").getSheetByName("シート1")
  sheet.getRange(1, 1).setValue(text)
}

function doPost(e) {
  if(typeof e !== 'undefined')
  Logger.log(e.parameter);
  recordText(e.parameter.text);

  return ContentService.createTextOutput({result: true}).setMimeType(ContentService.MimeType.JSON)
}

上記の中のスプレッドシートのIDには、シートのURLの一部を入れます。

次に、ページ投稿者がGitで公開されておられる、swiftプロジェクトをクローンして、ビルドします。

    fileprivate func readText(_ imageData: Data) {
        AF.upload(imageData,
                         to: "https://japanwest.api.cognitive.microsoft.com/vision/v1.0/ocr?language=ja&detectOrientation=true",
                         method: .post,
                         headers: [
                            "Content-Type": "application/octet-stream",
                            "Ocp-Apim-Subscription-Key": "APIキー"
            ]).validate(statusCode: 200...226)
            .responseJSON { response in self.readTextResponse(response: response)
        }
    }

japanwestは、リージョンが西日本となったためです。APIキーは、画像のような中からコピーしてきます。

さて、本題です。
App Scriptを開いて、ウェブアプリとして公開します。
右上からデプロイをクリックします。

新しいデプロイをクリックして、項目を設定します。

以上を設定しておいて、XCodeからデバッグします。
しかし、スクリプトにリクエストして結果を得たところ、401エラーが起こります。

            AF.request("https://script.google.com/macros/s/スクリプトの公開ID/exec",
                              method: .post,
                              parameters: ["text": text],
                              encoding: URLEncoding(destination: .methodDependent))
                .validate(statusCode: 200...226)
                .responseData { response in
                    switch response.result {
                        case .success:
                            print("Validation Successful")
                        case let .failure(error):
                            print(error)
                        }

                    }
            }

上記のerrorが401エラーです。これは権限のエラーです。

何故なのか、いろいろと調べましたが、わかりませんでした。スクリプトのコミュニティでも検索しましたが、大体はIDが違うとかアクセス件をanyoneしたのかといったものでした。
そして、もしてかしてというわけで、画面の内容が、Google検索結果と大きく違うので、エディターが変化していることを疑いました。
そこで、右上に「以前のエディタを使用」があり、クリックして、切り替えました。
さらに、メニューから公開をクリックして、ウェブアプリケーションとして導入をクリック
そのまま更新ボタンで公開します。
これで解消できました。

この件ですが、その後Googleに報告したところ、
buganizer-system@google.comから連絡があり、再現してビデオ送ってねときまして、再現しようとすると、できませんでした。
どうも、コードを変更するたびに、新たにウェブアプリとして公開するのが基本のようです。

    上に戻る