クイックスタートでは、Google Workspace API を呼び出すアプリを設定して実行する方法について説明します。
Google Workspace のクイックスタートでは、API クライアント ライブラリを使用して認証と認可のフローの詳細を処理します。独自のアプリにはクライアント ライブラリを使用することをおすすめします。このクイックスタートでは、テスト環境に適した簡素化された認証アプローチを使用します。本番環境では、アプリに適したアクセス認証情報を選択する前に、認証と認可について学習することをおすすめします。
Google Apps Script API にリクエストを送信する Go コマンドライン アプリケーションを作成します。
目標
- 環境を設定する。
- サンプルを設定します。
- サンプルを実行します。
前提条件
- Google ドライブが有効になっている Google アカウント。
環境を設定する
このクイックスタートを完了するには、環境を設定します。
API を有効にする
Google API を使用する前に、Google Cloud プロジェクトで有効にする必要があります。1 つの Google Cloud プロジェクトで 1 つ以上の API を有効にできます。
新しい Google Cloud プロジェクトを使用してこのクイックスタートを実施する場合は、OAuth 同意画面を構成し、自分自身をテストユーザーとして追加します。Cloud プロジェクトでこの手順をすでに完了している場合は、次のセクションに進みます。
-
Google Cloud コンソールで、メニュー menu
> [API とサービス] > [OAuth 同意画面] に移動します。
OAuth 同意画面に移動
- [ユーザーの種類] で [内部] を選択し、[作成] をクリックします。
- アプリ登録フォームに入力し、[保存して次へ] をクリックします。
現時点では、スコープの追加をスキップして、[保存して次へ] をクリックします。今後、Google Workspace 組織の外部で使用するアプリを作成する場合は、[ユーザーの種類] を [外部] に変更してから、アプリに必要な認証スコープを追加する必要があります。
- アプリ登録の概要を確認します。変更するには、[編集] をクリックします。アプリの登録に問題がない場合は、[Back to Dashboard] をクリックします。
デスクトップ アプリケーションの認証情報を承認する
エンドユーザーを認証してアプリ内でユーザーデータにアクセスするには、1 つ以上の OAuth 2.0 クライアント ID を作成する必要があります。クライアント ID は、Google の OAuth サーバーで個々のアプリを識別するために使用します。アプリが複数のプラットフォームで実行される場合は、プラットフォームごとに個別のクライアント ID を作成する必要があります。
-
Google Cloud コンソールで、メニュー menu > [API とサービス] > [認証情報] に移動します。
[認証情報] に移動
- [認証情報を作成] > [OAuth クライアント ID] をクリックします。
- [アプリケーションの種類] > [デスクトップ アプリ] をクリックします。
- [名前] フィールドに、認証情報の名前を入力します。この名前は Google Cloud コンソールにのみ表示されます。
- [作成] をクリックします。OAuth クライアントの作成画面が表示され、新しいクライアント ID とクライアント シークレットが表示されます。
- [OK] をクリックします。新しく作成された認証情報が [OAuth 2.0 クライアント ID] に表示されます。
- ダウンロードした JSON ファイルを
credentials.json
として保存し、ファイルを作業ディレクトリに移動します。
職場環境を整える
作業ディレクトリを作成します。
mkdir quickstart
作業ディレクトリを変更します。
cd quickstart
新しいモジュールを初期化します。
go mod init quickstart
Google Apps Script API Go クライアント ライブラリと OAuth2.0 パッケージを取得します。
go get google.golang.org/api/script/v1
go get golang.org/x/oauth2/google
サンプルのセットアップ
作業ディレクトリに、quickstart.go
という名前のファイルを作成します。
次のコードをファイルに貼り付けます。
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"google.golang.org/api/option"
"google.golang.org/api/script/v1"
)
// Retrieve a token, saves the token, then returns the generated client.
func getClient(config *oauth2.Config) *http.Client {
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
tokFile := "token.json"
tok, err := tokenFromFile(tokFile)
if err != nil {
tok = getTokenFromWeb(config)
saveToken(tokFile, tok)
}
return config.Client(context.Background(), tok)
}
// Request a token from the web, then returns the retrieved token.
func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
fmt.Printf("Go to the following link in your browser then type the "+
"authorization code: \n%v\n", authURL)
var authCode string
if _, err := fmt.Scan(&authCode); err != nil {
log.Fatalf("Unable to read authorization code: %v", err)
}
tok, err := config.Exchange(context.TODO(), authCode)
if err != nil {
log.Fatalf("Unable to retrieve token from web: %v", err)
}
return tok
}
// Retrieves a token from a local file.
func tokenFromFile(file string) (*oauth2.Token, error) {
f, err := os.Open(file)
if err != nil {
return nil, err
}
defer f.Close()
tok := &oauth2.Token{}
err = json.NewDecoder(f).Decode(tok)
return tok, err
}
// Saves a token to a file path.
func saveToken(path string, token *oauth2.Token) {
fmt.Printf("Saving credential file to: %s\n", path)
f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
log.Fatalf("Unable to cache oauth token: %v", err)
}
defer f.Close()
json.NewEncoder(f).Encode(token)
}
func main() {
ctx := context.Background()
b, err := os.ReadFile("credentials.json")
if err != nil {
log.Fatalf("Unable to read client secret file: %v", err)
}
// If modifying these scopes, delete your previously saved token.json.
config, err := google.ConfigFromJSON(b, "https://www.googleapis.com/auth/script.projects")
if err != nil {
log.Fatalf("Unable to parse client secret file to config: %v", err)
}
client := getClient(config)
srv, err := script.NewService(ctx, option.WithHTTPClient(client))
if err != nil {
log.Fatalf("Unable to retrieve Script client: %v", err)
}
req := script.CreateProjectRequest{Title: "My Script"}
createRes, err := srv.Projects.Create(&req).Do()
if err != nil {
// The API encountered a problem.
log.Fatalf("The API returned an error: %v", err)
}
content := &script.Content{
ScriptId: createRes.ScriptId,
Files: []*script.File{{
Name: "hello",
Type: "SERVER_JS",
Source: "function helloWorld() {\n console.log('Hello, world!');}",
}, {
Name: "appsscript",
Type: "JSON",
Source: "{\"timeZone\":\"America/New_York\",\"exceptionLogging\":" +
"\"CLOUD\"}",
}},
}
updateContentRes, err := srv.Projects.UpdateContent(createRes.ScriptId,
content).Do()
if err != nil {
// The API encountered a problem.
log.Fatalf("The API returned an error: %v", err)
}
log.Printf("https://script.google.com/d/%v/edit", updateContentRes.ScriptId)
}
サンプルの実行
作業ディレクトリでサンプルをビルドして実行します。
go run quickstart.go
-
サンプルを初めて実行すると、アクセスの承認を求められます。
-
Google アカウントにまだログインしていない場合は、ログインを求められたらログインします。複数のアカウントにログインしている場合は、承認に使用するアカウントを 1 つ選択してください。
- [Accept] をクリックします。
Go アプリケーションが Google Apps Script API を実行し、呼び出します。
認可情報はファイル システムに保存されるため、次回サンプルコードを実行するときに認可を求められることはありません。
次のステップ