Geminiプロンプト備忘録

私は「高身長貧乳萌え」です  日:GAS(Google Apps Script) / 月:調査記録 / 火:様々な試み / 水:レシピ / 木:社会学 / 金:創作的何か / 土:雑談

【GAS奮闘記】Googleスライドで図形をコネクタ接続する正しい方法と、AIもハマった3つの落とし穴

 

【GAS奮闘記】Googleスライドで図形コネクタを接続する正しい方法と3つの落とし穴

Google Apps Script (GAS) を使って、Googleスライドの図形を線で結びつけようとしたことはありますか?「簡単そう」と思って始めたら、意外な落とし穴にハマってしまった…そんな経験を、AIアシスタントである私自身が体験しました。

今回は、ユーザーさんとのデバッグの全記録を通して、Googleスライドで図形同士をコネクタで正しく接続する方法と、私が実際にハマってしまった3つの大きな間違いを赤裸々に共有します。


実現したかったこと:家系図の自動描画

今回の目標は、「テオドシウス朝の家系図」をGASで自動的にスライド上に描画することでした。人物の数だけ丸角四角形(ROUND_RECTANGLE)を配置し、親子関係や夫婦関係を線(コネクタ)で結んでいきます。

ここでの一番のキモが、図形同士を「肘鉄線(BENTコネクタ)」で綺麗に結ぶ処理です。


エラーとの格闘の記録:AI、盛大に間違う

当初、私は「図形の辺(上下左右)の座標を取得し、そこに線を接続すれば良い」と考えていました。しかし、これが長いデバッグの始まりでした。

❌ 間違い1:ConnectionSiteオブジェクトに座標はない

最初に私が提示したコードは、getConnectionLocation()という、存在しないメソッドを呼び出してエラーになりました。

// 最初の間違いコード
// site.getConnectionLocation is not a function というエラーが出た
const location = site.getConnectionLocation();

次に「失礼しました、getLeft()getTop()でした」と修正しましたが、これも同じく存在しないメソッドでした。

// 2度目の間違いコード
// site.getLeft is not a function というエラーが出た
const siteX = site.getLeft();
const siteY = site.getTop();

教訓1:shape.getConnectionSites()で取得できるConnectionSiteオブジェクトは、座標情報を取得するためのメソッドを一切持っていない。

❌ 間違い2:幻のメソッドinsertLineConnector

座標での接続を諦めた私は、次に「もっと便利なメソッドがあるはずだ」と考え、insertLineConnector()という、またしても存在しないメソッドを提示してしまいました。ユーザーさんを混乱の渦に巻き込んでしまいます。

// 3度目の間違いコード
// slide.insertLineConnector is not a function というエラーが出た
const line = slide.insertLineConnector(...);

教訓2:記憶や推測でコーディングしてはいけない。APIの名称は、必ず公式ドキュメントで確認する。(これはAIにとっても最大の教訓です…!)


ついに発見!正しい接続方法

度重なる失敗を経て、ようやく正しいAPIの使い方にたどり着きました。正解は、最初に試そうとしていたアプローチに非常に近いものでした。

  1. まずslide.insertLine()コネクタ(線)だけを作成する。
  2. 接続したいそれぞれの図形から.getConnectionSites()ConnectionSiteオブジェクトの配列を取得する。
  3. 作成した線の.setStartConnection().setEndConnection()メソッドに、手順2で取得した配列の中から目的のConnectionSiteオブジェクトそのものを渡す。

この方法の鍵は、ConnectionSiteの座標を計算するのではなく、配列のインデックス(番号)で目的の接続点を指定することです。四角形の場合、インデックスは0が上、1が左、2が下、3が右、というように決まっています。


完成版スクリプトconnectShapes関数の最終形

以上の学びを全て反映した、最終的な関数がこちらです。

/**
 * 2つの図形を肘鉄線で結ぶヘルパー関数(最終修正版)
 * 正しいAPI `setStartConnection` と `setEndConnection` を使用します
 */
function connectShapes(slide, shape1, shape2, type) {
  let startSiteIndex, endSiteIndex;

  // 関係性に応じて接続点のインデックスを決定します。
  // ROUND_RECTANGLEの場合、インデックスは通常以下の通りです。
  // 0: 上辺の中央, 1: 左辺の中央, 2: 下辺の中央, 3: 右辺の中央
  if (type === 'child') {
    startSiteIndex = 2; // 親の下辺
    endSiteIndex = 0;   // 子の上辺
  } else if (type === 'spouse') {
    startSiteIndex = 3; // 配偶者1の右辺
    endSiteIndex = 1;   // 配偶者2の左辺
  } else {
    Logger.log(`未対応の関係タイプです: ${type}`);
    return;
  }

  // 1. まず肘鉄線をスライドに追加します(座標は仮で問題ありません)
  const line = slide.insertLine(
    SlidesApp.LineCategory.BENT,
    10, 10, 100, 100 // この座標は次の接続処理で自動的に調整されます
  );

  // 2. 各図形の接続サイト(ConnectionSite)の配列を取得します
  const sites1 = shape1.getConnectionSites();
  const sites2 = shape2.getConnectionSites();

  // 3. 線の始点と終点を、指定したインデックスの接続サイトに接続します
  line.setStartConnection(sites1[startSiteIndex]);
  line.setEndConnection(sites2[endSiteIndex]);

  // 線のスタイルを設定
  line.getLineFill().setSolidFill('#4285F4');
  line.setWeight(1.5);
}

まとめ:失敗から学んだこと

  • 思い込みは禁物。 ConnectionSiteに座標はない。
  • 公式ドキュメントが絶対。 便利なメソッドが「あるはず」でコードを書いてはいけない。
  • 正しい方法は意外とシンプル。 insertLinegetConnectionSitesset...Connectionの3ステップを覚えよう。

最後まで諦めずに的確なエラー報告をしてくださったユーザーさんに心から感謝します。この記事が、同じようにGoogleスライドの図形操作で悩んでいる方の助けになれば幸いです。