0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google AntigravityにGoogle Apps Scriptの新規プロジェクトをゼロから作らせてみた

0
Last updated at Posted at 2026-10-18

GoogleのAIコーディングエージェント「Antigravity」で、Google Apps Script(GAS)の新規プロジェクトをclasp経由でゼロから作らせるタスクを試しました。ローカルCLI中心のAIコーディングエージェント(Claude Codeなど)と比べて、Googleのエコシステムとの連携でどこまで自律的に進められるかを確認するのが目的です。

依頼した要件

  • clasp createでスタンドアロン型のGASプロジェクトを新規作成する
  • スプレッドシートのA列に入力されたURLに対してHTTPリクエストを送り、ステータスコード(200・404など)をB列、ページタイトルをC列に書き込む
  • スプレッドシートのカスタムメニューから実行できるようにする
  • clasp pushでのデプロイと、実行に必要な権限承認まで完結させる

つまずき1:claspが入っていない

作業を開始したエージェントは、まずclasp -vを実行しようとしてコマンドが見つからないエラーに遭遇しました。

clasp -v
# CommandNotFoundException

ここで指示を出していないにもかかわらず、エージェントが自分で以下を実行してclaspを導入し、そのまま作業を継続しました。

npm install -g @google/clasp

「詰まったら自分で直して進む」という自己修復的な挙動は、今回の検証の中でも地味に好印象でした。

つまずき2:OAuth認証と権限承認

claspのログイン時にはOAuth同意画面が表示され、ここはユーザーの手動承認が必要でした。スプレッドシート側にカスタムメニューを初めて実行した際にも、「このアプリはGoogleで確認されていません」という警告が表示され、手動での許可が必要になります。

GASが外部APIやスプレッドシート以外のリソースにアクセスする実装では、こうしたGoogle側の未確認アプリ警告・OAuth同意は避けられない仕組みです。AIエージェントがどれだけ自律的でも、この部分はユーザーの手動操作が必須になります。

実装のポイント

要件を満たす実装は、大まかには次のような構成になります(UrlFetchAppでのHTTP取得+カスタムメニューの組み合わせ)。

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('URLチェッカー')
    .addItem('URLチェック実行', 'checkUrls')
    .addToUi();
}

function checkUrls() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  const urls = sheet.getRange(1, 1, lastRow, 1).getValues();

  urls.forEach((row, i) => {
    const url = row[0];
    if (!url) return;

    try {
      const response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
      const statusCode = response.getResponseCode();
      sheet.getRange(i + 1, 2).setValue(statusCode);

      if (statusCode === 200) {
        const html = response.getContentText();
        const match = html.match(/<title>(.*?)<\/title>/i);
        sheet.getRange(i + 1, 3).setValue(match ? match[1] : '');
      }
      // 200以外はC列を空欄のままにする
    } catch (e) {
      sheet.getRange(i + 1, 2).setValue('エラー: ' + e.message);
    }
  });
}

ポイントは、muteHttpExceptions: trueを指定して404等でも例外を投げさせず、レスポンスコードを素直に取得できるようにしている点です。これを指定しないと、404系のレスポンスでUrlFetchApp.fetchが例外を投げてしまい、エラーハンドリングが煩雑になります。

実行結果

テストデータには、意図的に404を返すURLも混ぜて動作確認されていました。結果は要件通りで、B列にステータスコード、C列にページタイトルが書き込まれ、取得に失敗した行はC列が空欄のままになっていました。

一番の見どころ:タスク完了後の自己分析

今回最も印象的だったのは、タスク完了後にエージェント自身が「どこで人間の介入が必要だったか」を表形式で自己分析していたことです。挙げられていたのは次の4点でした。

  • claspのログイン認証
  • Apps Script APIの有効化
  • スタンドアロン型プロジェクトの選択
  • 実行時のOAuth権限承認

「AIが自律的に進められる範囲」と「ユーザーのワンクリック承認が必要な範囲」の役割分担について、エージェント自身の言葉でまとめてくれていた点は、他のAIコーディングエージェントではあまり見かけない振る舞いでした。

まとめ

  • claspが未インストールだったことに気づき、自分でnpm installして継続する自己修復的な挙動が見られた
  • OAuth同意画面・未確認アプリ警告など、Google側の権限承認ステップは人間の手動操作が必須で、ここは完全に自律化できない
  • タスク完了後に「人間の介入が必要だった箇所」を自ら構造化して報告する振る舞いが、今回の検証で最も印象的だった

インストールから無料プランの実態まで含めた全体のレビューは、元記事にまとめています。
→ Google Antigravityを使ってみた:インストールからGoogle Apps Script連携タスクまで徹底レビュー

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?