Geminiを使ってVBAからGoogle Apps Scriptに変換する仕組みを作る【GAS】

新規にGoogle Workspaceを導入しようとなると1つ大きな障害があります。それが「マクロ資産はどうする?」問題。Enterprise PlusプランだとMacro Converterというのが利用できますが、この為だけに最上位の高価なプランに入るのはちょっと。

そこで、今回VBA + GAS + Gemini 1.5 Flashを使ってVBAコードをGASに変換し、スプシにPushするという仕組みを構築してみました。

VBA側ではModuleを出力したりファイルをアップし、サーバーたるGAS側は変換を主に担当します。

Google Workspaceを新規に導入する時に押さえたいポイント

今回利用するスプシやライブラリ等

今回の仕組みはなかなか複雑ですが、使うだけであれば事前準備のみで使えるのでそこまで大変ではありません。Excelのファイルをアドイン化して配布すれば、使ってるExcelをそのままドライブにアップ⇒GeminiがマクロをGASに変換⇒スプシのコード.gsに書き込みまでを一気に行います。

この仕組みで一番重要なのはProjectApp2ライブラリで、スプシにプロジェクトを作成し、GASのコードを直接プッシュすることが可能です。アドイン化する場合はVBAのメインの関数をリボンで構築してあげると良いでしょう。

※今回VBA側はマクロの記録で保存したModule1といった名称のついてる標準モジュールをエクスポートします。

※ChatGPTよりStrawberryという数学やプログラミングに焦点を当てたモデルがでるそうな。これを使った場合、より高度な変換が期待できるかもしれない。

ExcelとAccessに独自のリボンを追加する

【GAS】Google Apps Scriptでコードをバックアップ・遠隔更新する

事前準備

Gemini 1.5 FlashのAPIキーを取得する

2024年5月15日、Googleが発表した最新のAIモデルであるGemini 1.5 Flash。これは、Gemini Advancedのバックグラウンドで動いてるものになりますが、今回はそのAPIを直接利用します。

Bardの時とは違いGCPで色々準備してといった手間が省けるようになっています。以下の手順でGemini 1.5 FlashのAPIキーを今回は取得してみます。

  1. Googleアカウントにログインした状態にしておく
  2. こちらのウェブサイトにアクセスする
  3. APIキーを作成をクリックする
  4. 1個だけはそのままAPIキーを作成で続行できます。2つ目は既存のGCPプロジェクトを選ぶよう指示が出ます。GCPプロジェクトを指定しなかった場合には新規にGCPプロジェクトが生成されます。
  5. APIキーが発行されるのでコピーする

このAPIキーは無料ですが、流出することの無いように大切に保管する必要があります。このキーは後でGAS側で利用します。

図:APIキーを発行してる画面

AppSheetでGemini連携植物図鑑を作ってみた【GAS】

GCP側の準備

今回のGASのプログラムは、Drive APIを使ってVBA側からファイルをGoogle Driveにアップロードが必要なため、クライアントIDとシークレットが必要になります。

Google Apps Script APIをオンにする

Google Apps Script自体を管理や更新する為に、以下の作業をしておく必要があります。

  1. こちらのリンクをクリックして開く
  2. Google Apps Script APIをクリックする
  3. チェックがあるのでオンにする

この作業はそのプロジェクトをデプロイするアカウント毎に行う必要があります。

図:APIを有効化する

GCP側でAPIを有効化する

また、GCP側でもGoogle Apps Script APIを有効化する必要があり、またこの場合Drive APIも有効化する必要があるので、以下の手順でGCP側のAPIを有効化しておきましょう。

  1. GCPのプロジェクトを開く
  2. 左サイドバーからAPIとサービスを開く
  3. 上部にある「APIとサービスを有効化する」をクリックする
  4. 検索窓から「apps script」で検索すると一発でヒットするのでクリックする
  5. 有効化をクリックする
  6. 同じくDrive APIについても検索して有効化しておきます

図:GCP側でも有効化が必要です

GCP側とリンクする

この作業は、前述のGoogle Apps Script APIを利用する場合に必要な作業です。GCP側のプロジェクトとGASのプロジェクトをリンクさせる必要性があり、またGCP側でもAPIを有効化する必要があるので、連結しておきましょう。

連結する手順は以下の通り

  1. Google Cloud Consoleを開く
  2. 左上にある▼をクリックする
  3. ダイアログが出てくるので、新規プロジェクトを作るか?既存のプロジェクトを選択する。この時、Google Workspaceであれば選択元は「自分のドメイン」を選択する必要があります。
  4. プロジェクト情報パネルから「プロジェクト番号」をコピーする
  5. 対象のGoogle Apps Scriptのスクリプトエディタを開く
  6. サイドバーからプロジェクト設定を開く
  7. プロジェクトを変更ボタンをクリック
  8. GCPのプロジェクト番号に、4.の番号を入れてプロジェクトを設定をクリック

図:プロジェクト番号をコピーしておきます

図:プロジェクト変更画面

認証情報を作成する

VBA側からファイルをDriveにアップロードする等の為に必要なクライアントIDとシークレットを作成します。

  1. Google Cloud Consoleの認証情報作成を開く
  2. 認証情報を作成をクリックする
  3. OAuthクライアントIDを選択する
  4. クライアントIDの作成では、「ウェブアプリケーション」を選択する
  5. 承認済みのリダイレクト URIはVBA側と同じリダイレクトURLを指定します。
  6. 作成ボタンを押すと、クライアントIDクライアントシークレットが手に入るので控えておく。
  7. Cloud Consoleを閉じる

この2つは大切なものなので、漏れたりしないように保存しておく必要があります。また、今回のケースは内部利用目的なので、OAuth同意画面に於いては、ユーザの種類は「内部」とし、スコープでは、VBA側で指定してるものを指定しています。

リダイレクトURLは自社のホームページなどのURLを指定します。すると認証後にそこにAuthenticated Codeが表示されるので、このコードを取得してさらにAccess Tokenを取得する仕組みです。適当なURLを指定すると、相手側のサーバでログが残り、そこにAuthenticated Codeが記載されてるのでセキュリティ的にはよろしくありません。今回はこのサイトのホームページを指定しています。

図:クライアントID、シークレット取得しておきましょう。

図:OAuth同意画面の設定

VBAからGoogle Driveにファイルをアップロードする

GAS側の準備

ライブラリを導入する

GASのコードのバックアップや復元、またマニフェストの内容を更新する場合、Google Apps Script APIを利用してREST APIを叩いて操作する必要があります。リファレンスはこちらにあります。

  1. こちらのサイトに掲示されてるライブラリのスクリプトIDを取得する
  2. スクリプトエディタのライブラリの横にある+をクリックする
  3. 1.のスクリプトIDを追加して検索をクリック。
  4. 追加をクリックする
  5. 一回、適当な関数を作って実行し承認を実行する
  6. アカウントを選択して認証画面が出るので許可をクリックする

図:ライブラリを追加する

図:認証を許可する

Drive APIを有効にする

今回のスクリプトはDrive API v2を利用します。よって、以下の手順に従って、Drive APIをONにする必要性があります。

  1. スクリプトエディター画面に於いて、サービス欄の+記号をクリック
  2. Drive APIを探しだして、選択する
  3. 追加ボタンをクリックする(デフォルトだとv3なのでv2にしておきます)

これでDrive APIがGoogle Apps ScriptでDrive APIを使えるようになります。

図:Drive APIをオンにした

APIキーを書き込む

前述のGemini 1.5 FlashのAPIキーをコードの中に記述します。本来はスクリプトプロパティに格納して呼び出すほうがセキュアですが、今回は便宜的にコードに直書きです。

コード.gsの一番上にあるapikeyの変数内に直接、取得したAPIキーを記述しましょう。

図:ここにAPIキーを書き込む

ウェブアプリケーションとしてデプロイ

今回のアプリはGASの関数を叩くのではなく、ウェブアプリとして出力したURLに対してGETでリクエストをしてアクションを実現しています。そのため、以下の手順でウェブアプリケーションとしてデプロイし、URLを取得しておく必要があります。

  1. スクリプトエディタを開く
  2. 右上のデプロイをクリック
  3. 新しいデプロイをクリック
  4. 種類の選択ではウェブアプリを選択し、次のユーザとしてアプリケーションを実行で誰の権限で動かすかを指定する。今回は自分自身を指定します。
  5. アプリケーションにアクセスできるユーザを指定する。今回は組織内ユーザに限定します。
  6. 最後に導入すると、ウェブアプリケーションのURLが取得できます。このURLでアクセスをします。URLの最後がexecが本番用、これを控えておきます。
  7. 次回以降コードを編集して再デプロイ時はデプロイを管理から同じURLにて、新しいバージョンを指定して発行することが出来ます。

図:今回は次のユーザとして実行は管理者権限のあるアカウントにて

適当なフォルダのIDを取得しておく

ExcelファイルやVBAのモジュールをアップロードするフォルダが必要です。そのフォルダのIDを控えておきましょう。この後のVBA側の準備で利用します。

このフォルダに対してExcelファイルやモジュールのテキストがアップロードされ、またGeminiで変換したコード.gsファイルが保存されるフォルダになります。

VBA側の準備

各種ライブラリを追加する

今回のVBA側サンプルファイルは、以下のエントリーで作成したVBAでOAuth2.0認証を行う新方式のファイルを使っています。この中にはZeroInstall BrowserDriver for VBAがすでに入っており、ここにさらにVBAでJSONを扱うVBA-JSONを追加しています。

これらライブラリでGoogle認証やGAS側とのやり取り、Drive APIとのやり取りを実現しています。

VBAでOAuth2.0認証 - 新方式を試してみた

コードに値を記述する

今回のサンプルのVBA部分にはいくつか前述までに取得したものを記述として追加する必要があります。

  • authenticate - GCPで取得したクライアントID、シークレット、リダイレクトURLを記述します。
  • module_exporter - アップロード先のDriveのフォルダのID、execで終わるウェブアプリのURLを記述します。

これらの値を持って、Google側と通信してファイルアップロードやGAS変換リクエストを投げます。

図:VBAのコード内に直接記述します

VBAのセキュリティ設定の変更

今回のVBAコードは、VBAの実行だけじゃなく、対象のExcelファイル内に記録された「マクロの記録」のModuleファイルをテキストとしてエクスポートします。よって、以下のように設定を変更する必要があります。

  1. Excelのファイル⇒オプションを開く
  2. トラストセンター⇒トラストセンターの設定をクリック
  3. マクロの設定を開く
  4. VBAマクロを有効にするをクリック
  5. VBAプロジェクトオブジェクトモデルへのアクセスを信頼するにチェックを入れる
  6. OKをクリックして保存する

とくに5.のチェックがオンでないと、VBAからVBEのモジュールエクスポートが出来ないでエラーとなるので要注意。

図:セキュリティ設定変更が必要

実際に使ってみる

VBA側で認証を実行する

VBA側のauthenticateモジュール内にある「googleAuthorization」を実行します。

  1. Webブラウザが起動してログイン画面が出ます。
  2. 通常通り、Googleアカウントでログインします。
  3. アクセス権限の承認画面が出るので、指示に従って承認します。
  4. するとこのExcelファイルと同じディレクトリ内にsetting.iniにAccess Tokenが保存されます。このファイルは流出しないように大切に保管する必要があります。

これでGoogle側へのOAuth2.0認証が完了しました。

図:承認画面の様子

VBA側で変換を実行する

今回はサンプルファイルである自分自身のExcelと、その中に記述済みのマクロの記録であるMacro1とMacro2の標準モジュールの内容をGoogle Driveにアップロードして、GAS側で引き続きスプレッドシート変換、GeminiによるGASへの変換、スプシ内のコードgsに変換結果のコードをプッシュします。

VBA側のmodule_exporter内にあるExportAndUploadを実行します。今回は自分自身をアップしてるため、一旦自分自身のコピーをしてからアップしています。Moduleの中身はmodule.txtとして1枚にまとめられます。この2つのファイルをアップロードして、GAS側で処理をしてもらいます。

※GAS側のマクロとするには、今回のコード以外にもappsscript.jsonへの追記などちょっと仕組みの追加が必要です。以下のエントリーにまとめています。また、Macroの中身のコードは以下のとおりです。

Googleスプレッドシートのマクロの記録機能を使ってみた

変換結果を確認する

最終的に変換が完了すると、スプレッドシートが自動的に開かれて、対象のスプシ内にコードが入っていれば完了。このコードをテスト実行して認証すれば、移植が完了ということになります(アップしたフォルダ内には2個のファイルとは別に変換結果のコード.gsと変換したスプシの2つの計4つのファイルが出来上がります)。

アップロード先フォルダを確認しましょう。

図:無事に変換されてファイルが生成されました

図:変換結果が無事に書き込まれてました

ソースコード

GAS側コード

コード.gs

VBA側から、ExcelファイルのID、モジュールファイルのIDの2つをdoGetで受け取ったら、順番にファイル変換やGeminiによるGAS変換、プロジェクト作成、コードプッシュまでの一連の作業を実行し、最終的にスプシのIDを返します

一番のメインの処理を行う部分になります。

makeProjectでは、GASのプロジェクトの作成と関数の追加だけじゃなく、追加したマクロの関数をマクロの一覧に登録するようにappsscript.jsonに追加しています。

VBA側で関数リスト構築で用意したfuncnamelistシートはGoogleスプレッドシートでは不要なので削除しています。

図:マクロリストの構築まで行います。

図:appsscript.jsonもマクロメニューを自動構築

xlsxconvert.gs

Drive APIを使ってExcelファイルをスプレッドシートに変換するコードです。詳細については以下のエントリーでまとめています。

Google Apps ScriptにてExcelファイルを変換して取り込んでみる【GAS】

Gemini.gs

ここはVBAのコードをGeminiにGASへ変換させています。但し、指定のmaxOutputTokensが2048でしか指定していないので、長いコードの場合はもっと大きな数値をしておいたほうが良いと思います。

また余計な文言を削除するようにプロンプトを調整しています。

Geminiは与えるトークン量がかなり上限が高い(100万トークン位)ので、ClaudeやChatGPTよりもVBAコード変換のような事例では効果的です。

※この内容を変更すれば、ClaudeやChatGPTのAPIに置き換えることが出来るので、用途に応じてこの中身な書き換えると良いでしょう。

VBA側コード

Scopeに注意

OAuth2.0の認証に関する処理については、こちらのエントリーにある通りですが、1箇所注意点があります。今回のAccess Tokenは以下の複数のScopeに対して取得してるため、scope変数の中身が異なります。これはGAS側で使ってるスコープと同じだけ準備する必要があります。

変換実行するコード

行ってる作業は

  • 自分自身をコピー
  • 自身のVBA内にある標準モジュールの内、Module1といった名称のものだけを出力しmodule.txtにまとめて出力
  • 関数リストをまとめたfuncnamelistシートを別途コピーしたExcelに追記
  • 以上の2つをDrive APIを使ってアップロード
  • アップロード後にファイルのIDが取得できるので、2つのファイルのIDを元に、GAS側のexecのURLに対して変換依頼
  • 変換完了後、スプシのURLを取得して自動的に開いて完了

3回、HTTPリクエストを叩いています。最後の処理についてsetTimeoutsを長めに設定しておかないと、タイムアウトになってしまってエラーになるので要注意。

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)