AI,API,gemini,Google Apps Script,クラウド,センサー,中級,地図,生成AI

このチュートリアルでは、地図の中心周辺の観光名所をGoogle Gemini APIに問い合わせて地図上に表示し、マーカーをクリックするとその場所の説明を表示するアプリを作ります。

生成AI観光名所地図アプリでは観光名所をGeminiで検索してその場所を地図上にマーカーで表示しましたが、結構知らない場所も表示されるので、どんなところかわかると便利だろうと思い、マーカーをクリックするとその名前と住所に加えてその場所の説明も表示するようにしました。

この機能追加のために、アプリ本体とGASスクリプトを変更しています。

Google Gemini APIの呼び出しにはGoogle Apps Script(GAS)を使います。

Google AI Studio で作るGemini APIは課金方法を登録しなくても以下の範囲ならば無料で使えます。

  • 1 分あたりのリクエスト数: 5
  • 1 日あたりのリクエスト数: 250,000
  • 1 分あたりのトークン数(入力): 100

Google Apps Scriptの設定

Google Apps Scriptに設定方法などはここを参照してください。

GASスクリプトの変更

200文字以内の説明も返すようにマニュアルでスクリプトの中のプロンプトを変更します。

観光地検索API (Google Apps Script)

/**
 * App InventorからのGETリクエストを処理するメイン関数
 * @param {object} e - App Inventorから渡されるイベントオブジェクト
 * @returns {ContentService.TextOutput} - 観光地情報のJSONまたはエラーメッセージ
 */
function doGet(e) {
  // レスポンスのMIMEタイプをJSONに設定
  const response = ContentService.createTextOutput();
  response.setMimeType(ContentService.MimeType.JSON);

  try {
    // クエリパラメータから緯度、経度、半径を取得
    const lat = e.parameter.latitude;
    const lon = e.parameter.longitude;
    const radius = e.parameter.radius;

    // パラメータが不足している場合はエラーを返す
    if (!lat || !lon || !radius) {
      response.setContent(JSON.stringify({
        error: "パラメータが不足しています。'latitude', 'longitude', 'radius'が必要です。"
      }));
      return response;
    }

    // Gemini APIを呼び出して観光地情報を取得
    const touristSpots = getTouristSpots(lat, lon, radius);
    
    // 取得した情報をJSON形式で返す
    response.setContent(JSON.stringify(touristSpots));

  } catch (error) {
    // エラーが発生した場合、エラーメッセージをJSONで返す
    response.setContent(JSON.stringify({
      error: "データの取得中にエラーが発生しました。",
      details: error.message
    }));
  }

  return response;
}

/**
 * Gemini APIを呼び出して、指定された座標周辺の観光地情報を取得する
 * @param {number} latitude - 中心の緯度
 * @param {number} longitude - 中心の経度
 * @param {number} radius - 検索半径(メートル)
 * @returns {Array<Object>} - 観光地のリスト
 */
function getTouristSpots(latitude, longitude, radius) {
  // スクリプトプロパティからAPIキーを読み込む
  const API_KEY = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  if (!API_KEY) {
    throw new Error("APIキーがスクリプトプロパティに設定されていません。");
  }

  const API_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${API_KEY}`;

  // Geminiに渡すプロンプト(指示文)- 緯度経度が不要なことを明記
  const prompt = `
あなたは優秀なローカルツアーガイドです。
以下の中心座標と半径の範囲内にある観光地を最大5件まで探してください。
結果は必ず指定されたJSON形式で、名前と住所と200文字以内の説明のみを含めてください。緯度と経度は不要です。

中心緯度: ${latitude}
中心経度: ${longitude}
半径: ${radius}メートル
`;

  // Gemini APIに送信するデータ(ペイロード)- responseSchemaから緯度経度を削除
  const payload = {
    "contents": [{
      "parts": [{
        "text": prompt
      }]
    }],
    "generationConfig": {
      "responseMimeType": "application/json",
      "responseSchema": {
        "type": "ARRAY",
        "items": {
          "type": "OBJECT",
          "properties": {
            "name": { "type": "STRING", "description": "観光地の名前" },
            "address": { "type": "STRING", "description": "観光地の住所" },
            "desc": { "type": "STRING", "description": "観光地の説明" }
          },
          "required": ["name", "address"]
        }
      }
    }
  };

  // APIリクエストのオプション
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload),
    'muteHttpExceptions': true // HTTPエラー時もレスポンスを返す
  };

  // APIを呼び出す
  const response = UrlFetchApp.fetch(API_URL, options);
  const responseCode = response.getResponseCode();
  const responseBody = response.getContentText();

  if (responseCode !== 200) {
    throw new Error(`APIリクエストに失敗しました。ステータスコード: ${responseCode}, レスポンス: ${responseBody}`);
  }
  
  // レスポンスからJSON部分を抽出してパースする
  const result = JSON.parse(responseBody);
  const jsonText = result.candidates[0].content.parts[0].text;
  
  return JSON.parse(jsonText);
}

App Inventorアプリ

ページの最後にあるダウンロードセクションからソースコードをダウンロードできます。

[プロジェクト]メニューから[新規プロジェクトを始める]を選択し、"AITravelGuide"と名前を付けます。

デザイン編集

残りのコンテンツを表示するにはログインする必要がありますどうぞ . 会員ではないですか ? 入会のご案内

AI,API,gemini,Google Apps Script,クラウド,センサー,バイブコーディング,中級,地図,生成AI

このチュートリアルでは、地図の中心周辺の観光名所をGoogle Gemini APIに問い合わせて地図上に表示するアプリを作ります。観光名所地図アプリではGoogle Sheets APIを使ってGoogleスプレッドシートに入力された東京の観光名所を地図上に表示したので、あらかじめ入力した観光名所しか表示できませんでしたが、このアプリでは原理的にどの場所の観光名所でも表示できます。

Google Gemini APIの呼び出しにはGoogle Apps Script(GAS)を使います。GASのスクリプトはGoogle Gemini 2.5 Proで書いています。バイブコーディングです。

Google AI Studio で作るGemini APIは課金方法を登録しなくても以下の範囲ならば無料で使えます。

  • 1 分あたりのリクエスト数: 5
  • 1 日あたりのリクエスト数: 250,000
  • 1 分あたりのトークン数(入力): 100

Google Apps Scriptの設定

API呼び出し処理を行うサーバー側のプログラムをGoogle Apps Scriptに設定します。

Gemini 2.5 Pro を使って Google Apps Script を書く

無料のアカウントでもこちらからGemini 2.5 Proが使えます。

プロンプト

観光名所を地図上に表示するには緯度、経度が必要ですが、Geminiは緯度、経度を知っているとは限らないので、代わりに知っているはずの住所を返してもらい、位置センサーコンポーネントを使って緯度、経度に変換します。

App inventorの地図コンポーネントの中心の緯度、経度から指定した半径内にある観光地の名前と住所(緯度、経度は不要)を最大5件取得し、地図上にマーカーで表示したい。Google apps script とGoogle ai studio で取得するGemini APIキーでGemini 2.5 Flashを使う。他のAPIは使わない。結果はJSONで戻す。APIキーはスクリプトプロパティから読む。App inventor部分は自分でやるから、それ以外の部分を教えて。

返答

Google Apps Scriptだけではなく、Gemini APIの設定からウェブアプリとしてのデプロイ方法、使い方まで詳しく教えてくれます。

はい、承知いたしました。App Inventorから呼び出すためのGoogle Apps Scriptを作成します。

このスクリプトは、指定された緯度・経度・半径を基に、Gemini 2.5 Flashモデルを使用して周辺の観光地情報を最大5件取得し、JSON形式で返します。

以下に、Google Apps Scriptのコードと、その設定方法を説明します。

1. Google Apps Scriptの準備
まず、Google Apps Scriptプロジェクトを準備する手順を説明します。

Google Apps Script プロジェクトの作成と設定ガイド

  1. Google Driveを開く: Google Driveにアクセスします。
  2. 新規プロジェクト作成:

    • 左上の「+ 新規」ボタンをクリックします。
    • その他」 > 「Google Apps Script」を選択します。
    • もし表示されない場合は、「アプリを追加」から「Google Apps Script」を検索して接続してください。

  3. プロジェクトに名前を付ける:

    • 左上の「無題のプロジェクト」をクリックし、「観光地検索API」などの分かりやすい名前に変更します。

  4. スクリプトの貼り付け:

    • エディタに最初から書かれている function myFunction() { ... } をすべて削除します。
    • 後述するコードをすべてコピーして、エディタに貼り付けます。

  5. APIキーの設定:

    • 左側のメニューから歯車アイコンの「プロジェクトの設定」をクリックします。
    • スクリプト プロパティ」のセクションにある「スクリプト プロパティを追加」ボタンをクリックします。
    • プロパティGEMINI_API_KEY と入力します。
    • に、Google AI Studioで取得したご自身のAPIキーを貼り付けます。
    • スクリプト プロパティを保存」をクリックします。

  6. プロジェクトのデプロイ:

    • 右上の青い「デプロイ」ボタンをクリックし、「新しいデプロイ」を選択します。
    • 種類の選択(歯車アイコンの隣)で「ウェブアプリ」を選択します。
    • 次の設定を行います。

      • 説明: 「観光地検索API for App Inventor」など、分かりやすい説明を入力します。
      • 次のユーザーとして実行: 自分
      • アクセスできるユーザー: 全員

    • デプロイ」ボタンをクリックします。
    • 初回は「アクセスを承認」を求められます。ご自身のアカウントを選択し、詳細設定から安全でないページへの移動を許可して、スクリプトの実行を許可してください。
    • デプロイが完了すると、「ウェブアプリのURL」が表示されます。このURLをコピーしてください。App InventorからAPIを呼び出す際にこのURLが必要になります。

以上で、Google Apps Script側の準備は完了です。

2. Google Apps Script コード
こちらのコードを、先ほど作成したGoogle Apps Scriptプロジェクトのエディタに貼り付けてください。

観光地検索API (Google Apps Script)

/**
 * App InventorからのGETリクエストを処理するメイン関数
 * @param {object} e - App Inventorから渡されるイベントオブジェクト
 * @returns {ContentService.TextOutput} - 観光地情報のJSONまたはエラーメッセージ
 */
function doGet(e) {
  // レスポンスのMIMEタイプをJSONに設定
  const response = ContentService.createTextOutput();
  response.setMimeType(ContentService.MimeType.JSON);

  try {
    // クエリパラメータから緯度、経度、半径を取得
    const lat = e.parameter.latitude;
    const lon = e.parameter.longitude;
    const radius = e.parameter.radius;

    // パラメータが不足している場合はエラーを返す
    if (!lat || !lon || !radius) {
      response.setContent(JSON.stringify({
        error: "パラメータが不足しています。'latitude', 'longitude', 'radius'が必要です。"
      }));
      return response;
    }

    // Gemini APIを呼び出して観光地情報を取得
    const touristSpots = getTouristSpots(lat, lon, radius);
    
    // 取得した情報をJSON形式で返す
    response.setContent(JSON.stringify(touristSpots));

  } catch (error) {
    // エラーが発生した場合、エラーメッセージをJSONで返す
    response.setContent(JSON.stringify({
      error: "データの取得中にエラーが発生しました。",
      details: error.message
    }));
  }

  return response;
}

/**
 * Gemini APIを呼び出して、指定された座標周辺の観光地情報を取得する
 * @param {number} latitude - 中心の緯度
 * @param {number} longitude - 中心の経度
 * @param {number} radius - 検索半径(メートル)
 * @returns {Array<Object>} - 観光地のリスト
 */
function getTouristSpots(latitude, longitude, radius) {
  // スクリプトプロパティからAPIキーを読み込む
  const API_KEY = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  if (!API_KEY) {
    throw new Error("APIキーがスクリプトプロパティに設定されていません。");
  }

  const API_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=${API_KEY}`;

  // Geminiに渡すプロンプト(指示文)
  const prompt = `
あなたは優秀なローカルツアーガイドです。
以下の中心座標と半径の範囲内にある観光地を最大5件まで探してください。
結果は必ず指定されたJSON形式で、名前、住所、緯度、経度を含めてください。

中心緯度: ${latitude}
中心経度: ${longitude}
半径: ${radius}メートル
`;

  // Gemini APIに送信するデータ(ペイロード)
  const payload = {
    "contents": [{
      "parts": [{
        "text": prompt
      }]
    }],
    "generationConfig": {
      "responseMimeType": "application/json",
      "responseSchema": {
        "type": "ARRAY",
        "items": {
          "type": "OBJECT",
          "properties": {
            "name": { "type": "STRING", "description": "観光地の名前" },
            "address": { "type": "STRING", "description": "観光地の住所" },
            "latitude": { "type": "NUMBER", "description": "観光地の緯度" },
            "longitude": { "type": "NUMBER", "description": "観光地の経度" }
          },
          "required": ["name", "address", "latitude", "longitude"]
        }
      }
    }
  };

  // APIリクエストのオプション
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload),
    'muteHttpExceptions': true // HTTPエラー時もレスポンスを返す
  };

  // APIを呼び出す
  const response = UrlFetchApp.fetch(API_URL, options);
  const responseCode = response.getResponseCode();
  const responseBody = response.getContentText();

  if (responseCode !== 200) {
    throw new Error(`APIリクエストに失敗しました。ステータスコード: ${responseCode}, レスポンス: ${responseBody}`);
  }
  
  // レスポンスからJSON部分を抽出してパースする
  const result = JSON.parse(responseBody);
  const jsonText = result.candidates[0].content.parts[0].text;
  
  return JSON.parse(jsonText);
}

3. App Inventorでの使い方
App Inventor側では、「Web」コンポーネントを使って、デプロイ時に取得したウェブアプリのURLにGETリクエストを送信します。

URLの末尾に、以下のようにパラメータを追加してください。

<あなたのウェブアプリのURL>?latitude=35.681236&longitude=139.767125&radius=1000
latitude: 地図の中心の緯度

longitude: 地図の中心の経度

radius: 検索したい半径(メートル単位)

Webコンポーネントが GotText イベントで結果を受け取ったら、返ってきたJSON文字列を解析して、リストとして処理します。その後、各観光地の名前、住所、緯度、経度を使って地図上にマーカーを配置してください。

これで、App InventorアプリからGoogle Apps ScriptとGemini APIを連携させて、周辺の観光地情報を地図に表示する機能が実装できます。もし何かご不明な点があれば、お気軽にご質問ください。

プロンプト

結果に緯度、経度が含まれているので、緯度、経度を除いてコードを書き直してもらいます。

Geminiの結果から観光地の緯度、観光地の経度を除いて観光地検索APIコードを書き直して。

返答

残りのコンテンツを表示するにはログインする必要がありますどうぞ . 会員ではないですか ? 入会のご案内

Google Sheets API,チュートリアル,地図

地図の中心から指定した半径内にあるお店を検索する地図アプリを作成します

このチュートリアルでは、Google Sheets APIを使ってGoogleスプレッドシートに入力された東京のお店の情報をアプリに取り込み、地図の中心から指定した半径内にあるお店を地図上にマーカー表示、タップすると詳細を表示するアプリを作ります。アクティビティスターターを使って外部のブラウザを起動してお店のホームページを表示することもできます。ソースコードはページの最後にあるダウンロードセクションからダウンロードしてください。

このアプリでは読み取りだけ行うのでこのページに従ってあらかじめサービスアカウント作成する必要はありません。読み取るGoogleスプレッドシートのスプレッドシートIDは必要ですのでここを読んでスプレッドシートIDの取得方法を理解してください。

[プロジェクト]メニューから[新規プロジェクトを始める]を選択し、"RestaurantSearch“と名前を付けます。

Googleスプレッドシートの作成

お店の情報としては名前、緯度、経度、住所、電話番号、営業時間、定休日、提供料理、お店のURLを入力します。いくつか東京のお店を入力しました。好きなお店の情報を使ってみてください。クリックするとGoogleスプレッドシートを見れます。シート名は"restaurants“です。

Googleスプレッドシートの共有

このアプリはGoogleスプレッドシートを読み取るだけなので、Googleスプレッドシートのドキュメントが「リンクを知っている全員が閲覧できる」に設定します。

デザイン編集

Screen1のタイトルを"お店検索地図"にします。

地図 パレットから 地図(地図1) をビューアーに追加し、高さと横幅は"親要素に合わせる"にします。使いやすくなるように文字列からの中心座標を"35.681236,139.767125″にしておきます。これは東京駅の緯度、経度です。

地図 パレットから (1)を地図上に追加し、プロパティーを次のように設定します。

  • 塗りつぶし色:該当なし
  • 半径:300
  • ストロークカラー:赤
  • ストローク幅:3

レイアウト パレットから 垂直配置コンポーネント(垂直配置1) を地図の下に追加し、横幅は"親要素に合わせる"にします。

レイアウト パレットから 水平配置コンポーネント を6個、垂直配置1の中に追加し、その下に1個ボタンを追加します。水平配置コンポーネントの横幅は"親要素に合わせる"にし、中にはユーザーインターフェース パレットからラベルを2個ずつ追加して、名前とテキストを以下のように設定してください。

  • 水平配置1

    • 名前=ラベル1、テキスト=名前:
    • 名前=名前、テキスト=空白、横幅=親要素に合わせる

  • 水平配置2

    • 名前=ラベル2、テキスト=料理:
    • 名前=料理、テキスト=空白、横幅=親要素に合わせる

  • 水平配置3

    • 名前=ラベル3、テキスト=営業時間:
    • 名前=営業時間、テキスト=空白、横幅=親要素に合わせる

  • 水平配置4

    • 名前=ラベル4、テキスト=定休日:
    • 名前=定休日、テキスト=空白、横幅=親要素に合わせる

  • 水平配置5

    • 名前=ラベル5、テキスト=住所:
    • 名前=住所、テキスト=空白、横幅=親要素に合わせる

  • 水平配置6

    • 名前=ラベル6、テキスト=電話番号:
    • 名前=電話番号、テキスト=空白、横幅=親要素に合わせる

  • 名前=URLボタン、テキスト=ホームページ

レイアウト パレットから 水平配置コンポーネント(水平配置7) を1個、垂直配置1の下に追加し、その中にユーザーインターフェース パレットからボタンを2個、スピナーを1個、ラベルを1個並べ、プロパティーを以下のように設定してください。

  • ボタン:名前=現在地へ移動、テキスト=現在地へ移動
  • ボタン:名前=検索、テキスト=検索
  • スピナー:名前=検索範囲、文字列から要素=300, 500, 1000,10000
  • ラベル:名前=ラベル7、テキスト=m

非可視コンポーネントとしてストレージ パレットからスプレッドシートスプレッドシート1)、センサー パレットから位置センサー位置センサー1)、接続 パレットからアクティビティスターター(アクティビティスターター1)を追加します。プロパティーを以下のように設定してください。

  • スプレッドシート1:スプレッドシートID=XXXXXXXX

    • スプレッドシートIDは以下の手順で取得できます:

      • スプレッドシートを開く。
      • URL の中に含まれる「docs.google.com/spreadsheets/d/」に続く文字列(例:1A2B3C4D5E6F7G8H)がスプレッドシートIDです。
      • よくわからない場合は 14dsULf1K4Evu2jv9JRlBJFG7rKlqsTdyevBP5nv2XJA を使ってください。このスプレッドシートのスプレッドシートIDです。

  • 位置センサー1:デフォルトのまま
  • アクティビティスターター1:アクション=android.intent.action.VIEW

ここまでで下図のようになります。

ブロック編集機能を使用したプログラミング

残りのコンテンツを表示するにはログインする必要がありますどうぞ . 会員ではないですか ? 入会のご案内

API,チュートリアル,ユーティリティ,地図

グルメサーチAPIを活用して、周辺のお店を検索できる地図アプリを作成します

このチュートリアルでは、ホットペッパー グルメサーチAPI ホットペッパーグルメ Webサービス を活用して、地図上で表示している場所の近辺にある指定ジャンルのお店を検索し、マーカーで表示するアプリを作成します。地図上のマーカーをクリックすると、住所などの詳細情報を表示します。また、地図を現在地や入力した地名に移動させる機能も備えています。

ページの最後にあるダウンロードセクションからソースコードと実行用のapkファイルをダウンロードできます。使ってみると結構便利な実用的なアプリです。好きな場所でお店を探してみてください!

グルメサーチAPIを使用するには、APIキーが必要です。こちらで取得したAPIキーを公開することはできないため、各自で取得してください。APIキーは、メールアドレスを入力するだけで簡単に取得でき、利用は無料です。

APIキーの取得方法

新規登録ページでメールアドレスを入力します。

“リクルート Webサービス – メールアドレスの確認"というメールが送られてくるので、メールにあるURLをクリックします。

“リクルート Webサービス – APIキー発行完了のお知らせ"というメールでAPIキーが送られてきます。

これだけです!

デザイン編集

Screen1のタイトルを"グルメ検索地図"にします。

レイアウト パレットから 垂直配置コンポーネント を2個追加し、ビューアー上に縦に並べ、高さと横幅は"親要素に合わせる"に設定します。名前は垂直配置1と垂直配置2になっているはずです。

“垂直配置1“

  • 地図 パレットから 地図 を追加し、高さと横幅は"親要素に合わせる"にします。文字列からの中心座標を"35.681236,139.767125″にしておきます。これは東京駅の緯度、経度です。
  • レイアウト パレットから 水平配置コンポーネント を2個追加します。水平に整列するを"中央揃え"、横幅は"親要素に合わせる"にします。名前は水平配置1と水平配置2になっているはずです。
  • 水平配置1にユーザーインターフェース パレットから ラベルスピナー  を追加します。

    • ラベル のテキストプロパティーを"ジャンル"にします。
    • スピナー の名前は"ジャンル"、文字列から要素プロパティーを"居酒屋,ダイニングバー・バル,創作料理,和食,洋食,イタリアン・フレンチ,中華,焼肉・ホルモン,韓国料理,アジア・エスニック料理,各国料理,カラオケ・パーティ,バー・カクテル,ラーメン,お好み焼き・もんじゃ,カフェ・スイーツ,その他グルメ"に設定します。

  • 水平配置2にユーザーインターフェース パレットから ボタン を追加します。

    • ボタン の名前とテキストを"検索"にします。

“垂直配置2“

  • ユーザーインターフェース パレットから ウェブビュー を追加します。
  • 垂直配置2の目に見えるプロパティーのチェックを外します。

垂直配置2の下にレイアウト パレットからラベルを2個追加し、ビューアー上に縦に並べ、名前を"住所"と"営業時間"にします。テキストは両方とも空白にします。

レイアウト パレットから 水平配置コンポーネント を2個、"営業時間"ラベルの下に追加し、ビューアー上に縦に並べ、横幅を"親要素に合わせる"に設定します。名前は水平配置3と水平配置4になっているはずです。

“水平配置3“

  • ユーザーインターフェース パレットから ボタン を3個追加します。
  • ボタンの名前を"ブラウザ表示"、"地図表示"、"現在地移動"、テキストを"ブラウザ表示"、"地図表示"、"現在地に移動"にします。

“水平配置4“

  • レイアウト パレットから テキストボックスボタン を追加します。
  • テキストボックス の名前とヒントを"移動先住所"にします。
  • ボタン の名前を"住所移動"、テキストを"住所に移動"にします。

非可視コンポーネントの追加

残りのコンテンツを表示するにはログインする必要がありますどうぞ . 会員ではないですか ? 入会のご案内

Google Sheets API,チュートリアル,ユーティリティ,地図

Google Sheets APIを使って観光名所を表示する地図を作ります

このチュートリアルでは、Google Sheets APIを使ってGoogleスプレッドシートに入力された東京の観光名所を地図上に表示するアプリを作ります。複数台のスマホからの同時アクセスも可能ですし、Googleスプレッドシートでデータを変更すると表示されるデータに反映されます。ページの最後にあるダウンロードセクションからソースコードをダウンロードできます。

このアプリでは読み取りだけ行うのでこのページに従ってあらかじめサービスアカウント作成する必要はありません。読み取るGoogleスプレッドシートのスプレッドシートIDは必要ですのでここを読んでスプレッドシートIDの取得方法を理解してください。

[プロジェクト]メニューから[新規プロジェクトを始める]を選択し、"LandmarkExplorer“と名前を付けます。

Googleスプレッドシートの作成

地図上に観光名所を表示するには名所の名前、緯度、経度が必要です。ChatGPTに頼んでCSVファイルを作ってもらい、Googleスプレッドシートにしました。

ChatGPTに入力したプロンプトはこれです。無料アカウントでもできるので試してみてください。「東京」をあなたの住んでいる地名にするのも面白いですよ。

東京の観光名所の名前、緯度、経度のグーグル スプレッドシートを作りたいので、CSVファイルを作って。

ダウンロードしたCSVファイルをGoogleドライブにアップロードして、Googleスプレッドシートで開くだけです。こんな感じです。クリックするとGoogleスプレッドシートを見れます。シート名は"tokyo_landmarks“です。

Googleスプレッドシートの共有

このアプリはGoogleスプレッドシートを読み取るだけなので、Googleスプレッドシートのドキュメントが「リンクを知っている全員が閲覧できる」に設定します。

デザイン編集

Screen1のタイトルを"名所地図"にします。

地図 パレットから 地図 を追加し、高さと横幅は"親要素に合わせる"にします。使いやすくなるように文字列からの中心座標を"35.681236,139.767125″にしておきます。これは東京駅の緯度、経度です。

ストレージ パレットからスプレッドシートコンポーネントを追加します。使用するスプレッドシートの スプレッドシートID を取得し、それをプロパティーのスプレッドシートIDに設定してください。

  • スプレッドシートIDは以下の手順で取得できます:

    • スプレッドシートを開く。
    • URL の中に含まれる「docs.google.com/spreadsheets/d/」に続く文字列(例:1A2B3C4D5E6F7G8H)がスプレッドシートIDです。
    • よくわからない場合は 17Tukip5RlsU1LOBAkq0ngr3sMK1OLPxBKDq4sBwz8FI を使ってください。このスプレッドシートのスプレッドシートIDです。

ブロック編集機能を使用したプログラミング

アプリの動作をプログラミングするには、 ブロック編集機能にアクセスする必要があります。 画面右上のブロック編集ボタンをクリックしてブロック編集機能に行きます。

グローバル変数

残りのコンテンツを表示するにはログインする必要がありますどうぞ . 会員ではないですか ? 入会のご案内

センサー,チュートリアル,ユーティリティ,地図,小型DB

外出先で写真を撮った際に位置情報を取得し、それを地図上に表示・保存するアプリを作成します

このチュートリアルでは、外出先で写真を撮るとそのときの位置情報を位置センサーで同時に取得しそれを保存してあとで地図上で見ることができるアプリを作成します。ページの最後にあるダウンロードセクションからソースコードをダウンロードできます。

このアプリでは三つのスクリーンを使っていますが、スクリーン毎に同じグローバル変数を設定したり小型DBやウェブコンポーネントなどの同じコンポーネントを使うのは煩雑なので、Screen1だけを使って三つのスクリーンを切り替えて使う、仮想スクリーンテクノロジーを使っています。仮想スクリーンではScreen1に複数の垂直配置コンポーネントを配置してブロック編集内で「目に見える」をON/OFFしてスクリーンを切り替えます。

[プロジェクト]メニューから[新規プロジェクトを始める]を選択し、"PhotosOnMap“と名前を付けます。

デザイン編集

Screen1のタイトルを"写真地図"にします。

仮想スクリーンを作成

レイアウト パレットから 垂直配置コンポーネント を3個追加し、ビューア上に縦に並べ、横幅は"親要素に合わせる"に設定します。上から順に地図スクリーンリストスクリーン写真スクリーンという名前にしてください。それぞれの垂直配置コンポーネントが仮想スクリーンになります。それぞれの垂直配置コンポーネント(スクリーン)にコンポーネントを追加するときは他のスクリーンの目に見えるのチェックを外して作業してください。スクリーン切り替えにはこれらのプロシージャを使います。

“地図スクリーン

  • 地図 パレットから 地図 を追加し、高さと横幅は"親要素に合わせる"にします。
  • レイアウト パレットから  水平配置コンポーネント地図 の下に追加し、水平に整列するを"中央揃え"、横幅は"親要素に合わせる"にします。
  • 水平配置コンポーネント の中にユーザーインターフェース パレットから ボタン を3個追加し、左から順に名前とテキストを"リセット"、"写真撮影"、"一覧"にします。

リストスクリーン

  • ユーザーインターフェース パレットから リストビュー を追加し、高さと横幅は"親要素に合わせる"に、リストビューレイアウトを"メインテキスト、詳細テキスト(横)"にします。
  • レイアウト パレットから  水平配置コンポーネントリストビュー の下に追加し、水平に整列するを"中央揃え"、横幅は"親要素に合わせる"にします。
  • 水平配置コンポーネント の中にユーザーインターフェース パレットから ボタン を3個追加し、左から順に名前を"リストリターン"、"削除"、"詳細"に、テキストを"リターン"、"削除"、"詳細"にします。

“写真スクリーン

  • レイアウト パレットから  垂直配置コンポーネント を追加し、水平に整列するを"中央揃え"、高さと横幅は"親要素に合わせる"にします。
  • 垂直配置コンポーネント の中にユーザーインターフェース パレットから画像、ラベルを2個、ボタンを1個追加します。画像は高さと横幅は"親要素に合わせる"、回転角度は"90.0″に、ラベルの名前は日時とコメントにし、テキストは空白に、ボタンは名前を"写真リターン"、テキストを"リターン"にします。

非可視コンポーネントの追加

ユーザーインターフェース パレットから通知機能を2個、メディアパレットからカメラ、センサーパレットからタイマーと位置センサー、ストレージパレットから小型DBとファイル、接続パレットからウェブを追加します。

ここまでで下図のようになります。

ブロック編集機能を使用したプログラミング

アプリの動作をプログラミングするには、 ブロック編集機能にアクセスする必要があります。 画面右上のブロック編集ボタンをクリックしてブロック編集機能に行きます。

データ構造

このアプリでは小型DBにデータのリストを格納しています。データはJSONでその構造はChatGPT-o1が設計したもので以下の通りです。

photosList = [
  {
    "imagePath": "file:///storage/emulated/0/DCIM/Camera/IMG_20250101_123456.jpg",
    "latitude": 35.xxxxx,
    "longitude": 139.yyyyy,
    "timestamp":  "2025-01-01 12:34:56",
    "comment":       "初日の出"
  },
  ...
]

JSONを直接作る機能はApp Inventorにはありませんが、ウェブコンポーネントにディクショナリをJSONにエンコード(Jsonオブジェクトのエンコードメソッド)・デコード(Jsonテキストデコードメソッド)する機能があるのでこれを使います。

残りのコンテンツを表示するにはログインする必要がありますどうぞ . 会員ではないですか ? 入会のご案内