タグ: Google Apps Script

  • 日本語で魔法のようにGAS開発がはかどる「GASSISTANT」

    2024年10月7日、日本語で魔法のようにGASコーディングがはかどる「GASSISTANT」(ガシスタント)なるツールがリリースされました。

    https://gassistant.vercel.app

    開発したのは日本人の横田大伍さん(@daigo_3_8)。

    https://note.com/chaen_channel/n/n0be3b13a0e04

    これはよさそう、と思ったのですが、一方で「実際にお役に立ちそうなGASのユーザー、特にローコードと初心者の間を行ったりきたりするようなGASコーディングですら難しい人にはちょっととっつきづらそう…」、そして、逆に「ClaspのようなTypeScriptでGASを書いている人」にも「とっつきづらそう…」という印象もありました。これは試さねば。

    ★このあたりは開発者の横田さんよりメッセージを頂いております(文末)

    なおAICU media編集部やAIDX Labには しらいはかせをはじめとして10年来のGAS開発者がいます。普段からClaudeのArtifactsや、vercel「v0」のような対話型のコード支援環境も使っていますが、ストレスもあります。ブラウザのタブをいったりきたりする必要がありますし、時々「全文を出力して」といったお願いをしないと、コードの差分に悩まされることも多々ありました。CursorやCopilotのようなコード補完だけでなく、GitHubのdiffを見ながら、相談しながらテスト環境を動かしてデプロイからテストまで実行していきます。しかもこの方法ではコードが視界を通過しているだけで、頭の中で判断として残りません。AIがアシストしているわりに、危険なコードが大量に生成される可能性もあります。

    GASSISTANTはそんな悩みを解決してくれそうです。AIがコードの提案からデバッグまでを自動で行ってくれるので、コーディングが驚くほどスムーズになることを確認できました。

    実際に使ってみた!

    まず、個人のGmailアカウントを使って、テスト用にひとつGoogle Spreadsheetを作りましょう。実験用にGASSISTANTというスプレッドシートを作成して、拡張機能→Apps Scriptでエディタを開きました。

    画像

    GASエディタのURLを設定する準備をします。URLの赤い部分がスクリプトIDですが、URLそのものをコピーして貼り付けると、GASSISTANTのエディタ側でIDをリンクしてくれますので、これで準備OKということになります。

    画像

    GASSISTANTにGoogleアカウントでログインし、GASSISTANT のプライバシー ポリシー利用規約をご確認ください。

    なお、初回はチュートリアルが起動しますので、いったんスキップするか終わらせるかしてみてからでなければ設定に入れません。軽くチュートリアルの内容を紹介します。

    画像

    右下のチャット窓に相談をすると解説とともにGASのコードが生成されるようです。

    画像

    左側のエディタ画面に提案が表示されます。
    全て反映するか、断るかを個々のコードブロックで選べるようです。
    GitHubでのDiffよりも便利かもしれません!

    画像

    コードの提案を反映させたら「保存してデプロイ」を押します。数秒待つと保存が終わります。

    画像

    「実行して自動修正」を押すと、右のチャット履歴にテストデータが投げられ、実行されている様子が見えます。

    画像

    右のチャット履歴にはコードの「反映」や「コピー」、そして説明やテストパラメータのJSONが表示されます。

    画像

    ※チュートリアルとしては、ここで「反映」ボタンを押すと進みます。
    (チュートリアルから抜けられなくて慌てました)
    追記:このあたりは早速改善が入ったようです!

    画像

    さて、丁寧なチュートリアルは終わりです。
    用意した「GASSISTANT」スプレッドシートのエディタからURLを貼り付けましょう。

    画像

    ちなみにチュートリアルが終わった時点で300クレジットが279クレジットになっていました(汗)

    アップグレードすると月額2980円だそうです。クレジットが増えるのか、使い放題になるのかは、まだよくわかりません(問い合わせしました!文末に回答をまとめています)。

    画像

    Slack通知機能を追加してみた

    チュートリアルは「A列にメールアドレスの束があるのでメールを送信して」というお願いでコードが生成されていました。
    追加のリクエストとして、以下のようなリクエストを右下のチャット窓に打ち込んでみました。

    実行開始時と終了時にSlack通知。WebHookのエンドポイントはScriptPropertiyの SLACK_WEBHOOK_URL で指定します。

    GASSISTANTからの返答は以下の通りでした。

    • Slackに通知を送信するために、Google Apps ScriptにSlackのWebhookを使用するコードを追加しましょう。以下のコードでは、メール送信の開始時と終了時にSlack通知を送信するようにしています。
    • コードブロック
    • 説明: `sendSlackNotification`関数を追加し、SlackのWebhook URLを使ってメッセージを送信します。`PropertiesService.getScriptProperties().getProperty(‘SLACK_WEBHOOK_URL’)`でWebhook URLを取得します。事前にScript PropertiesにこのURLを設定しておく必要があります。メール送信の開始時と終了時にそれぞれSlackに通知を送信します。 このコードを使う前に、Script Propertiesに`SLACK_WEBHOOK_URL`を設定してください。これにより、指定されたSlackチャンネルに通知が送信されます。

    以下が生成されたコードです。

    function sendEmails() {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      const lastRow = sheet.getLastRow();
      const emailColumn = 1; // A列
    
      // メールの件名と本文を設定
      const subject = "件名をここに入力";
      const body = "本文をここに入力";
    
      // Slack通知: メール送信開始
      sendSlackNotification("メール送信を開始します。");
    
      for (let i = 1; i <= lastRow; i++) {
        const emailAddress = sheet.getRange(i, emailColumn).getValue();
        
        if (emailAddress) {
          try {
            MailApp.sendEmail(emailAddress, subject, body);
            logEmailStatus(emailAddress, "送信成功");
          } catch (error) {
            logEmailStatus(emailAddress, `送信失敗: ${error.message}`);
          }
        }
      }
    
      // Slack通知: メール送信終了
      sendSlackNotification("メール送信が完了しました。");
    }
    
    function logEmailStatus(email, status) {
      const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("AI Log");
      if (!logSheet) {
        // "AI Log"シートが存在しない場合は作成
        logSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("AI Log");
      }
      logSheet.appendRow([new Date(), email, status]);
    }
    
    function sendSlackNotification(message) {
      const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
      if (!webhookUrl) {
        Logger.log("Slack Webhook URLが設定されていません。");
        return;
      }
    
      const payload = JSON.stringify({text: message});
      const options = {
        method: 'post',
        contentType: 'application/json',
        payload: payload
      };
    
      UrlFetchApp.fetch(webhookUrl, options);
    }

    コードの差分に「Accept」「Reject」が表示されています。

    画像

    どれも大丈夫そうなコードですが、いちおう一つづつ確認して「Accept」してもいいですし、画面上にある「すべて適用」を押してもいいと思います。日本語UIは新鮮ですね!

    「保存してデプロイ」を押してみます。確認のために本家GASのコードエディタの方をリロードしてみると、反映されているようです。

    画像

    なお、従来通りのGASエディタでのコード修正も問題なくできそうです。修正して保存したあとはGASSISTANT側の「同期」で現在のコードを吸い上げることができます。
    ちょうど 「Google Apps Script GitHub アシスタント」に動作が近いと思いました。

    https://chromewebstore.google.com/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja

    さて、スクリプトプロパティにSlackのWebHookのURLを指定する機能はなさそうなのでGASエディタ側で設定します。

    画像

    「プロジェクトの設定」から「スクリプトプロパティ」で自分が決めた「SLACK_WEBHOOK_URL」を設定します。このURLはSlack上でIncoming Webhookを設定することで取得できます。

    画像

    ここでは別のプロジェクトの開発で使ったボットのIncoming Webhookを再利用しています。

    GASSISTANTに戻って「実行して自動修正」を実行します。するとアラートが出て実行が止まりました。

    画像

    外部(Slack)にアクセスする処理を加えたので当然、新たな権限承認が必要になったようです。GASエディタに行って権限を確認してきます。
    デバッグ実行を行って、権限承認ダイアログから、

    画像

    左下の「無題のプロジェクト(安全ではないページ)に移動」を選んで権限の許可を実施します。

    画像

    これでA列にメールアドレスを書いておけば、メールも無事に送信できるようになります。誤爆に注意しましょうね。
    このへんで終わっておけばいいのですが、さらに「実行して自動修正」を押すと、なんだか更に改善したいようです。

    エラーメッセージから、`doGet`関数が見つからないことが原因でエラーが発生していることがわかります。このため、`doGet`関数を追加して、GETリクエストからパラメータを受け取り、`sendEmails`関数を呼び出すようにします。 以下は修正されたコードです。

    画像

    最終的にはdoGet(e)関数から sendEmails(subject, body)を呼ぶ形になりました。テストJSONを受け取るにはこのほうが良いかもしれませんね。

    デバッグ結果を見ると、GETリクエストを使用してメールが正常に送信され、スプレッドシートの「AI Log」シートに送信結果が記録されています。すべてのメールが「送信成功」となっており、特に問題は見られません。 現時点でコードに改善が必要な箇所はありません。メール送信機能が期待通りに動作していることが確認できました。このまま引き続きご利用いただけます。 もし追加で何か特定の改善点や機能追加のリクエストがあればお知らせください。

    function doGet(e) {
      const subject = e.parameter.subject || "件名をここに入力";
      const body = e.parameter.body || "本文をここに入力";
      
      sendEmails(subject, body);
      
      return ContentService.createTextOutput("メール送信が完了しました。");
    }
    
    function sendEmails(subject, body) {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      const lastRow = sheet.getLastRow();
      const emailColumn = 1; // A列
    
      // Slack通知: メール送信開始
      sendSlackNotification("メール送信を開始します。");
    
      for (let i = 1; i <= lastRow; i++) {
        const emailAddress = sheet.getRange(i, emailColumn).getValue();
        
        if (emailAddress) {
          try {
            MailApp.sendEmail(emailAddress, subject, body);
            logEmailStatus(emailAddress, "送信成功");
          } catch (error) {
            logEmailStatus(emailAddress, `送信失敗: ${error.message}`);
          }
        }
      }
    
      // Slack通知: メール送信終了
      sendSlackNotification("メール送信が完了しました。");
    }
    
    function logEmailStatus(email, status) {
      const logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("AI Log");
      if (!logSheet) {
        // "AI Log"シートが存在しない場合は作成
        logSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("AI Log");
      }
      logSheet.appendRow([new Date(), email, status]);
    }
    
    function sendSlackNotification(message) {
      const webhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
      if (!webhookUrl) {
        Logger.log("Slack Webhook URLが設定されていません。");
        return;
      }
    
      const payload = JSON.stringify({text: message});
      const options = {
        method: 'post',
        contentType: 'application/json',
        payload: payload
      };
    
      UrlFetchApp.fetch(webhookUrl, options);
    }

    さらに追加機能を実装していく…!

    この時点で「残りクレジット: 119」となりました。まだまだ無料で遊べそうです。さらなる改造をしてみましょう。

    ・B列には送信相手のフルネーム、C列には送りたいメッセージの本文が入ります。
    ・D列には送信日時を入れてください。
    ・Webhookには送信者名、メールアドレス、送信内容を1件毎通知してください。
    ・全体の処理の件数と所要時間を計測してレポートしてください。
    ・いちど送信した相手には2週間以上期間をあけてから送信してください。
    ・毎週火曜日朝9時に実行するトリガーを設定してください。

    こんな感じに実行できました!メールも届いています!

    【送信履歴が付いたスプレッドシート】

    画像

    【Slackでの通知】

    画像

    気になった点

    基本的にはよくできていると思いました!
    ・クレジットが何なのか、月額プランが何なのかよくわからなかった(わかれば課金したい気持ちも出てきます!)
    ・実行したい関数が何なのか、軽く指定できるといいのかもしれないです。この例でもdoGetに落ち着くのはいいことかなと思いますが、一方でトリガー設定は実行されていませんでした。実行しようとするとGASエディタからマニュアル操作になるし、権限承認ダイアログもあるのでこれでいいのかもしれません。

    画像

    ・改善が終わらない。
     「実行して自動修正」というボタンの都合上かもしれないのですが、方向感なく改善を続けてしまいがちです。コードを評価したり「これで完成です」といってGitPushしたりする機能があるといいのかも。

    ・一度許可したシートへのアクセスを解除する方法がわからない。
     このままだとコードが固定できないので本番運用には問題があるかもしれません。データを外部に漏らさないためにもシートへのアクセスを解除したいところです。もしくは生成したコードを本番用に移植するといった作業は必要かもしれませんね。

    おまけ「GASSISTANT Opener」

    同じ作者さんが開発したChrome拡張です。
    GASエディタを開くとGASSISTANTを開けと言われ続けるようになります。

    https://chromewebstore.google.com/detail/gassistant-opener/nhkidgdaohjomakblaafjblkphnlmije

    GASエディターを開いたらGASSISTANTを開く提案をします

    GASSISTANT(https://gassistant.ai-zen.co.jp/)は初期設定が最小限に抑えられていますが、スクリプトID設定は手動で行う必要があります。 この拡張機能では、GASエディタからGASSISTANTを開きスクリプトIDを設定するフローが自動化されているため、ワンクリックでGASSISTANTを使い始めることができます。

    便利もありますが、不便になる要素もあるかも!?
    今後のアップデートに期待です。

    追記:開発者さんに聞いてみた!

    早速ご返信いただきました。

    料金について

    アップグレードすると即時3000クレジットに増加し、以降毎月3000クレジット付与されます。
    なおクレジットは追加ではなく、毎月3000にリセットされる形です。
    また、アップグレードするとAIの処理を自分のDify上でホストすることが可能になります。
    この設定をした場合、クレジットは消費されません(Dify側でAPI利用料がかかります)。

    セキュリティについて

    秘匿情報の取り扱い・Webアプリとして公開するなどの自明なリスクについては開発者に任せる想定でしたが、より丁寧な運用ガイドも用意すべきだと感じています。

    想定ユースケースについて

    想定ユースケースはclaspを使うほどでもない規模の開発です。

    本番運用でGASSISTANTを使う際は、セキュリティ面で言うとアップグレードしてDifyをセルフホスト、後日実装する実行可能APIでのデプロイをお勧めしております。

    セキュリティについて

    セキュリティについても引き続き注視し、安心してお使いいただけるようリスク低減に努めてまいります。

    GASSISTATN開発者

    まとめ

    GASSISTANTは、GASコーディングを劇的に効率化する革新的なツールです。GASコーディング初心者から中上級者まで、幅広い人におすすめできる感じがあります。いわゆる「ひとり情シス」みたいな方には強い味方ですね!

    アップグレードすると自分のDify上で使えるのはいいですね。
    機密情報の取り扱いや開発のワークフローなども理解して使えば、かなり革新的なAI活用ができそうです!

    注意

    GASSISTANT のプライバシー ポリシー利用規約をご確認ください。
    ※AICU編集部注:Google Apps Script経由で外部ツールを使って個人情報や売上情報を扱うような用途になる場合は特に注意して読んで理解してから試用することをおすすめします。内部で使用されているLLMの動作やログの収集内容、組織のポリシーによっては利用に適さない可能性もあります。(本稿に限らず)AIの使用による事故や過失の責任は使用者にあります。また積極的に開発者にお問い合わせしましょう。

    GASSISTANT – AIネイティブなGASエディタ
    https://gassistant.vercel.app
    https://gassistant.ai-zen.co.jp/

    【予告】「GASSISTANT」についてはAICU Magazine「 #サクッと先取り !クリエイティブAIツール」のコーナーでも扱っていきたいと思います!

    #サクッと先取り !クリエイティブAIツール #AICUmagazine
    #GASSISTANT  #GAS #GoogleAppsScript

    https://j.aicu.ai/MagV5

    https://j.aicu.ai/MagV4

    https://j.aicu.ai/MagV3

    https://j.aicu.ai/MagV2

    https://j.aicu.ai/MagV1

    Originally published at https://note.com on Oct 7, 2024.

  • #10分で学べるAI Google Slidesでバリエーション広告を大量生成

    #10分で学べるAI Google Slidesでバリエーション広告を大量生成

    「ようこそ!アイキュー部」-1話

    「AIでクリエイティブなビジネスをする!」をテーマに学内起業コンテストにエントリー提案をして「アイキュー部」を設立したKotoちゃん。

    今日は知り合いの不動産会社から依頼された案件に取り組んでいます。

    Koto「あ~あ、新築分譲マンションのバリエーション広告を作ってくれ……って頼まれたんだけど、今日はもう帰らないと…ルゥくん、あと頼むわね!」

    ★バリエーション広告:さまざまな対象者に向けて制作する多様性のある広告

    ルゥ「Koto先輩!?待ってください、何やってるんですか?」
    Koto「え……?アイキュー部で受けたバイトなんですが何か問題でも?」
    ルゥ「そうなんだ……って!なんで手で作ってるんですか?『AIでクリエイティブなビジネスする』ってのがこの部活なんですよね??」
    Koto「私は『アートイラスト・キュレーション部』の略のつもりで「AICU部」って書いたつもりなんだけど……審査員の先生にウケが良かったのでついそのまま……」
    ルゥ「押し切られちゃったんですか!?」
    Koto「こうやって部室も案件もらえたし、いいじゃない。しっかり稼ぎましょ」

    ルゥ「まあ……そうですね、で、これは何なんですか?」

    Koto「わからないの?『マンションポエム』よ!!」
    ルゥ「『上質が佇む(たたずむ)至高の邸宅』……なんだかよくわからないけどこれがあるだけでリッチな感じしますね」
    Koto「『これをできるだけ多くのバリエーションを作ってこい』というのがクライアントから出された課題よ」
    ルゥ「たしかにAI画像生成でできなくもなさそうだけど……これをいくらで受けたんですか?」
    Koto「ああ!もう帰らないと門限が!じゃあ私が家につくまでに、そのAI画像生成とやらで、最低15パターンをGoogle Slidesに作っておいてね!」
    ルゥ「ひぃ」

    ――どうしよう、突然、大量の広告ビジュアルの生成を頼まれちゃった。画像生成しようにもGPUもないしな…。

    あ、でもこんな時は… Stability AI の Stable Image CoreGoogle Apps Scripts が使えるかも!

    ……とおもったら、即実行。こんな感じに出来上がってました!

    ▼「ようこそ!アイキュー部」-1話(後編)はこの技術解説の続きにあります▼

    やってみよう

    Stability AI が提供する Stability AI Developer Platform のイメージサービス のうちのひとつ「Stable Image Core」 のAPIを使って、GPUいらず、たった3分程度で商用利用できるバリエーション広告(さまざまな対象者に向けて制作する多様性のある広告)画像を様々なスタイル画像で生成してみましょう。今回はGoogle Slidesだけ、ノーコードで利用できるツールとして提供します。

    Stability AI のプラットフォーム APIキーの入手

    まず、このプログラムで画像生成をするには Stability AI のプラットフォームを利用するAPIキーが必要です。持ってない人はここにアクセスしてAPIキーを取得するか、管理者殿にお願いしてキーを発行してもらってください。

    https://platform.stability.ai/account/keys

    生成できない場合は支払い設定(https://platform.stability.ai/account/credits)を確認してください。

    Copy ❏ したら「sk-….」で始まるAPIキーをクリップボードにコピーできます。このAPIキーが流出すると勝手に使われてしまいますので管理はお気をつけて。

    次のステップに進みます。

    Google Slides コピーして自分のDriveに

    このリンクでコピーして使える Google Slidesを配布しています。
    お使いのGoogleアカウントでアクセスしてください。

    https://j.aicu.ai/SAIAD

    こんな画面のGoogle Slidesが表示されます。このあと自分のDriveにコピーしていきます。

    ファイル⇢「コピーを作成」⇢「プレゼンテーション全体」を実行します。

    「ドキュメントをコピー」のダイアログが表示されますので、そのまま「コピーを作成」ボタンを押してください。

    初回起動でAPIキーを設定

    まず最初に、APIキーを設定します。

    スライドの上に以下のようなダイアログが表示されます。コピーした直後に表示されるはずです。

    [S.] Stability AI Platform API Key Required

    このツールでは、画像を生成するために Stability AI プラットフォームの APIキー が必要です。
    お持ちでない場合は、https://platform.stability.ai/account/keys でAPIキーを取得してください。

    This program requires a Stability.ai API key to generate images.
    If you do not have one, please visit https://platform.stability.ai/account/keys to obtain an API key.

    と表示されますので、冒頭で取得した「sk-」で始まる51文字のAPIキーを貼り付けてOKを押してください。

    もし、コピー直後のダイアログで設定しそびれた人は、メニューの[AI Image Generator]⇢[Set API key]を実行することで設定できます。

    スクリプト実行権限の設定

    次に、APIキーの動作確認とスクリプト実行権限の許可を行います。メニューの3番目「Generate Images」を選んでみてください。

    「認証が必要です」というダイアログが表示されるはずです。

    スクリプト実行権限を許可していきます。

    現在お使いのGmailアドレスが表示されているはずです。

    スクリプト実行権限を許可するアカウントを選びましょう。保存先ドライブを選択する意味もありますので、実験目的であれば、まずは個人をおすすめします。

    アカウントを選択すると、今度は 「⚠️ このアプリは Google で確認されていません」という警告が表示されます。危険なアプリではありませんので左下の「詳細」を押して行きます。

    最後に「AICU-AdGenerator(安全ではないページ)に移動」を押して、各サービスへの許可を設定していきます。

    許可ボタンを押すことでドライブへの閲覧、書き込み権限、スライドの編集、外部サービス(Stability AIのAPI)へのアクセスを許可します。編集履歴などはお使いのGmailアカウントで実行したことが記録されますし、知らないうちに実行するような処理にはなっておりませんのでご安心ください。

    権限の設定が終わったら、再度メニューの3番目「Generate Images」を選んでみてください。

    「スクリプトを実行しています」が表示され、画像の生成がはじまります。

    3分程度で、「画像の生成が完了しました。フォルダを確認してください」が表示されるはずです。

    Google Driveのマイドライブ直下「AICU-Stability-AdGenerator https://j.aicu.ai/SAIAD のコピー」というフォルダに以下のような画像が生成されていれば成功です!

    これは同じプロンプトに対して、 異なるスタイルが15種類適用された画像になります。

    Google Slides自動生成とキャッチコピーの配置

    これで終わり!でもいいと思ったのですが、クライアントの要求は画像の生成だけでなく、「マンションポエム」と呼ばれるキャッチコピーも含まれるような気がしたので、もうひと押しGoogle Slidesで頑張ってみます。

    Kotoさんが作っていたスライドにあったキャッチコピー「上質が佇む至高の邸宅。」とスタイルを第1ページに設定してあります。こちらは自由に編集していただいて構いません。

    これで準備は完了です!

    下の[Prompt=]に生成したいもの,
    [NP=] に見たくないものを英語で入れて
    メニューの3番目の[AI Image Generator]⇢[Add Slides by all styles] を選んでみてください。

    「スクリプトを実行しています」と表示されます。

    この後の結果が出るまでは、数分かかります。無事に生成されるとこのように15枚のスライドがキャッチコピー付きで生成されます。左下のスライド一覧表示にしてみましょう。

    初期状態では「Prompt=urban tokyo bayfront skyline residences ad luxury super rich visual」(プロンプト=東京ベイフロントのスカイライン・レジデンス広告の豪華なスーパー・リッチ・ビジュアル)となっているので、このまま何度でも「Add Slides by all styles」を実行すれば15枚づつ、東京湾ベイエリアの高級そうな住居の画像が生成されます。第1ページにある「Prompt=」と「NP=」を変えるだけなので、例えばこんなプロンプトにしてみます

    Prompt=Paris urban apartment  パリの都会のアパルトマン
    NP=Nsfw, worst quality
      (ネガティヴ・プロンプト)職場にふさわしくない、悪いクオリティ

    Stability AIの Stable Image Core API に実装されている多様なスタイルのおかげで、自然なバリエーション広告を生成できています。ネガティヴ・プロンプトのおかげもあってか、あまり出来の悪いスライドはありませんが、不要なスライドやキャッチコピーの修正を行って完成です。

    このSlidesに追加してある「AI Image Generator」メニューから実行できる機能の詳細は以下のとおりです。

    ・ Set API Key:Stability AI のAPIキーを設定します。

    ・Add Slides by all styles:タイトル(1枚目のスライド)で「Prompt=」で与えられたプロンプトと「NP=」で与えられたネガティブプロンプト(英語)から Stability AIの Stable Image Core API を使用して15種類のスタイル適用済み画像をGPU不要で画像を生成し、1枚生成されるごとに、スライドの画面全体に表示されるように背景画像として配置しています。追加された各スライドのタイトルとメモに 使用したstyleとプロンプトを設定しています。

    ・Generate Images:タイトル(1枚目のスライド)で与えられたプロンプトから、スライドのファイル名と同じ名前のディレクトリにすべてのスタイルの‪2,040 x 1,152‬pixelsの画像を15スタイル生成します。

    ・Save All Slides:PDF がDriveに保存されます。Google Slidesの[ファイル]⇢[ダウンロード]で保存でも構いません。

    ・15スタイルの生成は3分程度で51credit (80円ぐらい)です。

    ※安全のため、他人とシェアするときは Set API Keyを使って有効ではないAPIキーを設定しておくことをおすすめします。
    ※本ツールのソースコードが気になる方は Google Slides上でスクリプトエディタをご参照ください。このコードの著作権はAICU Inc. が保有しています。この記事で公開されているツールの使用における損害等についてAICU Inc.は責任を負いません。
    ※実際の広告等への利用など Stable Diffusionの商用利用に関するご質問は sai@aicu.ai までお問い合わせください。

    技術解説「Slidesだけでも画像生成できる」

    Google SlidesをコピーしてAPIキーを貼り付けるだけで様々なスタイルの画像を生成をすることができました!

    AICU media では今後も話題の Stable Diffusion 3.0 やStable Image Core を用いた記事を発信していく予定です。面白かったらぜひフォロー、いいねをお願いします!

    次回予告

    さてその後のアイキュー部のDiscordでのやり取りです

    ルゥ「Koto先輩~、Google Slides作っておきましたよ~」
    Koto「わあ!すごいのができたね!!早速クライアントに提出してくる!」

    (…しばらく後…)

    Koto「ルゥくんゴメェン!今回のクライアントは『Google Slides禁止!』だそうです!!」
    ルゥ「うええええええええ!先に聞いてきてくださいよ!!」

    せっかくルゥくんが頑張って作ったGoogle Slidesですが、別のアプローチを探さねばならないようです。

    #10分で学べるAI いかがでしたでしょうか?ご感想は X@AICUai までいただけると幸いです。

    続きはこちら

    漫画「ようこそアイキュー部」はこちらに続きます!

    ▼ようこそ!アイキュー部 第1話 https://note.com/aicu/n/ne878b6d68004

    ▼AICUマガジン5月号 https://j.aicu.ai/Mag2405

  • Stable Diffusion 3 を Google Apps Scriptで利用する

    Stable Diffusion 3 を Google Apps Scriptで利用する

    つくる人をつくる!AICU mediaのしらいはかせです

    先日、APIが先行して公開された Stable Diffusion 3ですが、色々試していたらわりと簡単にコマンドラインでも、Google Apps Scriptでも Stable Diffusion 3のパワフルな画像生成機能を利用できることがわかったので紹介いたします。
    ちょっとした画像を生成するアプリを開発するのに便利です。

    Stability AI の API キーの入手

    まずは Stability AI のプラットフォームでAPIキーを入手しましょう。
    https://platform.stability.ai/

    右上のアカウントアイコンから「API Keys」を確認できます。
    作成したらクリップボードにコピーします。

    0.0065USD=約1円ぐらいです。

    curlコマンドで使う Stable Diffusion 3

    Windowsで標準的にインストールされているコマンドラインツール「curl」を使ってAPIを叩くことができます。まずはこれを使って試してみましょう。

    curl -f -sS "https://api.stability.ai/v2beta/stable-image/generate/sd3" -H "authorization: Bearer sk-????" -H "accept: image/*" -F prompt="Lighthouse on a cliff overlooking the ocean" -F output_format="jpeg" -o "./lighthouse.jpeg"
    
    
    
    
    

    分解して解説するとこんな感じです。
    curl -f -sS “https://api.stability.ai/v2beta/stable-image/generate/sd3→SD3のAPIエンドポイントです。v2betaとあるので変更されるかも?
    -H “authorization: Bearer sk-????” -H “accept: image/*” -F
    →ベアラーのあとの sk-???? のところにAPIキーを貼り付けてください。
    prompt=”Lighthouse on a cliff overlooking the ocean” -F
    →ここがプロンプトです
    output_format=”jpeg” -o “./lighthouse.jpeg”
    →ここが出力ファイル形式です。Webp形式なんかも使えます。

    うまく行かないひとは「Windows cURLインストール」などで調べてみてください。けっこういろんな方法があるのですが、自分の環境ではこんな cURL が動いてました。

    curl — version
    curl 8.4.0 (Windows) libcurl/8.4.0 Schannel WinIDN
    Release-Date: 2023–10–11
    Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
    Features: AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets

    “curl — version”とコマンドラインで打ち込むと表示されます

    Google Apps Script で使う Stable Diffusion 3

    これがうまく行ったら次は、Google Apps Scriptで実装します。
    Google Driveを開いて、新規→その他→Google Apps Scriptで新しいスクリプトを作ります。

    // Stable Diffusion 3 を Google Apps Scriptで利用する|AICU media @AICUai #note https://note.com/aicu/n/ne2fe8a0073b0
    
    const STABILITY_KEY = PropertiesService.getScriptProperties().getProperty("STABILITY_KEY");
    
    function saveImageToDrive() {
      var url = "https://api.stability.ai/v2beta/stable-image/generate/sd3";
      var token = "Bearer "+ STABILITY_KEY; // 本番環境ではセキュリティを考慮して保管してください
      var boundary = "-------314159265358979323846";
      var data = "--" + boundary + "\r\n" +
                 "Content-Disposition: form-data; name=\"prompt\"\r\n\r\n" +
                 "shibuya crossing, animetic, with graffiti 'AICU media'\r\n" +
                 "--" + boundary + "\r\n" +
                 "Content-Disposition: form-data; name=\"output_format\"\r\n\r\n" +
                 "png\r\n" +
                 "--" + boundary + "\r\n" +
                 "Content-Disposition: form-data; name=\"aspect_ratio\"\r\n\r\n" +
                 "16:9\r\n" +
                 "--" + boundary + "--";
    
      var options = {
        "method": "post",
        "contentType": "multipart/form-data; boundary=" + boundary,
        "headers": {
          "Authorization": token,
          "Accept": "image/*"
        },
        "payload": data,
        "muteHttpExceptions": true
      };
    
      var response = UrlFetchApp.fetch(url, options);
      
      if (response.getResponseCode() == 200) {
        var blob = response.getBlob();
        blob.setName("SD3.png");
        var file = DriveApp.createFile(blob);
        Logger.log('Image saved to Drive with ID: ' + file.getId());
      } else {
        Logger.log('Failed to fetch image: ' + response.getResponseCode());
      }
    }

    GitHubにも置いておきます。
    https://github.com/aicuai/GenAI-Steam/blob/main/SD3Text2Img.gs

    このコードは上記の cURL でのリクエストを単純に置き換えたものですが、APIキーをハードコードしたりGitHubに晒したくはないので、スクリプトプロパティに保存しています。

    const STABILITY_KEY = PropertiesService.getScriptProperties().getProperty(“STABILITY_KEY”);

    スクリプトの左側「⚙プロジェクトの設定」からスクリプトプロパティを設定することができます。

    「スクリプトプロパティを追加」ボタンを押して「STABILITY_KEY」というプロパティを追加して、値として、冒頭で取得した「sk-」から始まるAPIキーを貼り付けて「スクリプトプロパティを保存」ボタンを押してコード編集に戻りましょう。

    これでコードにAPIキーを保存しなくてすみますね!
    さて、関数「saveImageToDrive」を実行していきます。

    コードの上部にある「デバッグ」を押すと実行できますが、初回は権限設定と確認が必要です。

    こんな感じの警告が出ますが、自分のGmailの権限でGoogle Driveに画像を生成するだけなので特に害はありません。左下の「SD3(安全ではないページ)に移動」を押して進めます。

    ドライブへの権限を設定したらもう一度デバッグを押して実行します。

    数秒で実行ログに「Image saved to Drive with ID: 1xxxxxx」と表示されたら成功です。Google Driveの「最近使用したアイテム」を見てみてください。

    「SD3.png」が生成されています。

    実行する度に様々な画像が生成されます。
    なお、このスクリプトではプロンプトとアスペクト比を12~17行で設定しています。

    “shibuya crossing, animetic, with graffiti ‘AICU media’\r\n”
    →ここがプロンプトです。ちゃんと文字「AICU media」が描けています。
    “Content-Disposition: form-data; name=”aspect_ratio”\r\n\r\n” + “16:9\r\n”
    →縦横比「16:9」を指定しています。1:1の場合は1024×1024、16:9にした場合は 1344×768 の画像が生成されました。

    APIマニュアルはこちら

    https://platform.stability.ai/docs/api-reference#tag/Generate

    せっかくなので翻訳していきます。

    prompt プロンプト:必須

    文字列 [ 1 … 10000 ] 文字
    出力画像に表示したい内容。要素、色、被写体を明確に定義した、強く説明的なプロンプトがより良い結果を導きます。

    aspect_ratio アスペクト比:文字列

    デフ ォ ル ト : 1:1
    列挙 : 16:9 1:1 21:9 2:3 3:2 4:5 5:4 9:16 9:21
    生成画像のアスペクト比を制御します。

    mode モード:文字列 (生成モード)

    デフォル ト : text-to-image
    「text-to-image」か「image-to-image」(画像パラメータ が必要かどうか)を制御します。

    text-to-image
    このモー ド では、 必須パラメータ は prompt だけです。このモードでは、生成される画像の縦横比を制御するために、aspect_ratioパラメータをオプションで使用することができます。

    image-to-imageモードでは、さらに2つのパラメータを指定する必要があります: image — ランダムノイズの代わりに、生成の開始点として使用されます。 strength — 画像が拡散プロセスに与える影響を制御するために使用されます。また他の指定できるパラメータもかわります。

    negative_prompt 
    文字列 <= 10000文字
    出力画像で見たくないものを説明するテキスト。これは高度な機能です。
    このパラメータは sd3-turbo では動作しません。

    model モデル:文字列
    デフォルト: sd3
    列挙型: sd3 sd3-turbo
    生成に使用するモデル。
    sd3 は生成あたり 6.5 クレジットを必要とします。
    sd3-turbo は1生成あたり4クレジット必要です。
    ★100クレジット=1USDです。だいたい10円ぐらいです。安っ!

    seed シード: 数値 
    [ 0 .. 4294967294 ]。
    デフォルト: 0
    生成の’ランダム性’を導くために使用される特定の値。(このパラメータを省略するか、0を渡すとランダムなシードを使用します)。

    output_format 出力形式 
    文字列
    デ フ ォル ト : png
    列挙型: jpeg png
    生成画像のコンテントタイプを指定します。WebPも使えるようです。

    Image to Image、アップスケール、そしてエディット機能、さらに「Control」と書かれた機能がドキュメントに存在します。

    Stability AI の 画像サービスには、4つのカテゴリがあります。

    生成

    最高のテキスト画像生成サービスです。これらのサービスは、Stability AIが提供する最新のStable Diffusionモデルを活用し、専門家による微調整とマイクロサービスをワークフローに組み込んでいます。その中でも、Stable Image Coreは、迅速なエンジニアリングを必要とせず、多様なスタイルで高品質の画像を得ることができるフラッグシップサービスです。

    アップスケール

    標準的で昔からあるアップスケールから、画像を4Kの傑作に変えるクリエイティブモードまで、クラス最高の画像アップスケールです。中でもCreative Upscaleは、低画質入力からフォトリアリスティックな画像を作成するためのフラッグシップの手法です。

    エディット

    マスク(生成的塗りつぶし)や文字によるインペイントを含む、最も効果的なAIベースの画像編集サービス。背景除去などの基本的なツールだけでなく、商品配置や広告用のニッチなツールも含まれています。

    コントロール(まだ未公開)

    最高の画像から画像へのサービス。プロンプト、マップ、その他のガイドが必要な場合があります。これらのサービスは、ControlNetsやStable Diffusionモデルに基づいて構築された同様の技術を活用しています。

    色んな機能が出てきて楽しみです。
    しかも1生成あたり6~10円となると気軽に使えますね。
    本記事のGoogle Apps Scriptでの活用について、 X(Twitter)@AICUai でご感想いただければ幸いです。色々開発してみたいと思います。

    AICU Inc.は Stability AI 公式パートナーです。
    様々なアプリ開発のご相談も承っております!

    https://corp.aicu.ai/ja/stability-ai

    https://corp.aicu.ai/ja/stability-ai-membership


    Originally published at https://note.com on April 23, 2024.