見出し画像

クラウドワークスの1万円のGAS案件やってみた(【無料】スクリプト公開)

こんにちは、スタートアップでエンジニアをしているKaitoです
今日はクラウドワークスにあったGASの1万円案件の依頼内容を参考にして開発してみます

見つけた時点で応募締め切られてたlol

結果から言うとこんな感じのものができた

動作確認動画


これの作成は1時間くらいだったと思います
朝活中にGASの遊びネタをクラウドワークスで探してたら見つけて、作れそうだなと思って好奇心のまま作りました

作ってみた結果、実用的かと言われればまあGoogleマップでいいよねってなるかもしれませんが

いやそんなことないか

例えば車のレッカー会社で取引先の事務所が全国にある場合に、そのリストを作っておけばお客さんから郵便番号聞くだけで最寄りの取引先をお伝えできますね

こういう5000円〜1万円くらいの案件は初学者の練習にはとても良いのではないでしょうか

一部お見せしますが、こんな感じのループ処理は大学の授業でも嫌になるくらい何回も教えられますよねw

  // 全ての行について繰り返す
  for (var i = 0; i < values.length; i++) {
    var address = values[i][0]; // 住所を取得
    var geocode = getGeocode(address); // 住所から緯度経度を取得
    var distance = getDistance(targetAddress, geocode); // 2点間の距離を計算
    if (distance < minDistance) { // 最小距離よりも小さければ
      minDistance = distance; // 最小距離を更新
      nearestAddress = address; // 近い住所を更新
    }
  }

これ以外には
◯住所から緯度経度を取得する関数
◯2地点間の距離を計算する関数
などを作成しました

結構ラジアンの計算とか数学的なことしたので、数学好きは楽しめる内容だと思いました!!

ちゃんと1万円分の仕事になるコードなので全公開は有料にしておきます

コピペで使えるGAS

まずはcode.gas

function findNearbyAddress() {
  var sheet = SpreadsheetApp.getActiveSheet(); // アクティブなシートを取得
  var range = sheet.getDataRange(); // データが入力されている範囲を取得
  var values = range.getValues(); // 全ての値を取得
  var zipCode = Browser.inputBox('郵便番号を入力してください'); // ダイアログボックスで郵便番号を取得
  var targetAddress = getGeocode(zipCode); // 郵便番号から緯度経度を取得
  var minDistance = Number.MAX_VALUE; // 最小距離を初期化
  var nearestAddress = ''; // 近い住所を初期化
  
  // 全ての行について繰り返す
  for (var i = 0; i < values.length; i++) {
    var address = values[i][0]; // 住所を取得
    var geocode = getGeocode(address); // 住所から緯度経度を取得
    var distance = getDistance(targetAddress, geocode); // 2点間の距離を計算
    if (distance < minDistance) { // 最小距離よりも小さければ
      minDistance = distance; // 最小距離を更新
      nearestAddress = address; // 近い住所を更新
    }
  }
  
  // 近い住所をメッセージボックスで表示
  Browser.msgBox('近い住所は「' + nearestAddress + '」です');
}

// 住所から緯度経度を取得する関数
function getGeocode(address) {
  var geocoder = Maps.newGeocoder().setRegion('jp'); // Geocoderオブジェクトを作成
  var response = geocoder.geocode(address); // 住所から緯度経度を取得
  if (response.status == 'OK') { // 正常に取得できた場合
    var location = response.results[0].geometry.location; // 緯度経度を取得
    return location;
  } else { // 取得できなかった場合
    return null;
  }
}

// 2点間の距離を計算する関数
function getDistance(a, b) {
  var lat1 = a.lat;
  var lng1 = a.lng;
  var lat2 = b.lat;
  var lng2 = b.lng;
  var R = 6371; // 地球の半径 (km)
  var dLat = (lat2 - lat1) * Math.PI / 180;
  var dLng = (lng2 - lng1) * Math.PI / 180;
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat1 * Math.PI / 180)
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var distance = R * c;
  return distance;
}

次にボタン表示のためのGASです(button.gas)

function onOpen() {
  let ui = SpreadsheetApp.getUi()
  
  //メニュー名を決定
  //★★★メニュー名は好きなものに置き換えてください★★★
  let menu = ui.createMenu("住所検索");
  
  //メニューに実行ボタン名と関数を割り当て
  //★★★実行ボタン名は好きなものに置き換えてください★★★
  menu.addItem("実行","findNearbyAddress");
  
  //スプレッドシートに反映
  menu.addToUi();
}

これらをGASのエディタでそれぞれファイル作ってコピペすれば使えますので、皆さんどうぞお使いください!

この記事が気に入ったらサポートをしてみませんか?