외부 데이터 옵션

앱에서는 Google Cloud SQL을 사용하여 데이터를 저장하는 것이 좋습니다. 하지만 앱에서 다음과 같은 방식도 지원됩니다.

  • JDBC를 사용하여 외부 MySQL 데이터베이스에 데이터를 기록합니다. JDBC API는 애플리케이션을 데이터베이스에 연결하기 위한 업계 표준입니다.
  • HTTP 요청과 REST API를 사용합니다.

외부 데이터베이스에 데이터 저장

Apps Script JDBC 서비스를 사용하여 Google 이외의 MySQL 데이터베이스에 데이터를 저장하는 앱을 만들 수 있습니다. 예를 들어 스크립트를 사용하여 데이터 행을 외부 데이터베이스에 기록할 수 있습니다.

// Replace the variables in this block with real values.
    var address = 'database_IP_address';
    var user = 'user_name';
    var userPwd = 'user_password';
    var db = 'database_name';

    var dbUrl = 'jdbc:mysql://' + address + '/' + db;

    // Write one row of data to a table.
    function writeOneRecord() {
      var conn = Jdbc.getConnection(dbUrl, user, userPwd);

       var stmt = conn.prepareStatement('INSERT INTO entries '
          + '(guestName, content) values (?, ?)');
      stmt.setString(1, 'First Guest');
      stmt.setString(2, 'Hello, world');
      stmt.execute();
    }
    

외부 데이터베이스를 사용한 쓰기읽기 방법에 대해 자세히 알아보세요.

JDBC 샘플 앱 사용해 보기

Google은 Google 이외의 MySQL 데이터베이스를 사용하여 데이터를 읽고 쓰는 앱을 빌드하는 데 필요한 스크립트, UI 요소, 계산된 모델에 대해 자세히 알아볼 수 있도록 샘플 앱을 만들었습니다. 이 앱의 README를 확인하여 데이터베이스 연결을 위한 앱 맞춤설정 방법을 알아보세요.

REST 서비스 호출

Representational State Transfer(REST) API를 사용하여 타사 서비스에서 정보를 검색하는 앱을 만들 수 있습니다. 예를 들어 다음 스크립트는 사용자가 입력한 위치를 사용하여 외부 서비스에서 해당 위치의 일기 예보를 요청합니다.

/**
     * Calls Geonames.org to fetch coordinates for a provided US city or location.
     * @param {string} location A city or location in the US.
     * @return {object} an object with lng and lat fields.
     */
    function getLocationCoordinates_(location) {
      var url = 'http://api.geonames.org/searchJSON?q=' + escape(location) +
          '&maxRows=1&username=' + GEONAMES_ACCOUNT;

      console.log('Geonames url is: ' + url);
      console.log('Fetching lat & lng from geonames.org for location \'' +
                    location + '\'');

      var response = JSON.parse(UrlFetchApp.fetch(url));
      return response.geonames[0];
    }

    /**
     * Calls Weather Service with lat lng to get office location url.
     * @param {string} lat Latitude.
     * @param {string} lng Longitude.
     * @return {object} an object with the forecast office info.
     */
    function getOfficeInfo_(lat, lng) {
      var url = 'http://api.weather.gov/points/' + lat + ',' + lng;
      console.log('Forecast office is: ' + url);

      var fetchParameters = {
        headers: {
          'Accept': 'application/json'
        }
      };

      var response = UrlFetchApp.fetch(url, fetchParameters);
      return JSON.parse(response);
    }

    /**
     * Get weather forecast from provided office.
     * @param {string} forecastUrl URL with the office forecast.
     * @return {object} an object with the forecast.
     */
    function getWeatherForecast_(forecastUrl) {
      console.log('Forecast url is: ' + forecastUrl);

      var fetchParameters = {
        headers: {
          'Accept': 'application/json'
        }
      };

      var response = UrlFetchApp.fetch(forecastUrl, fetchParameters);
      return JSON.parse(response);
    }

    /**
     * Calls REST services to fetch weather for a provided US city or location.
     * @param {string} location A city or location in the US.
     * @return {object} an object with forecast and city/state.
     */
    function getWeather_(location) {
      var coordinates = getLocationCoordinates_(location);

      if (coordinates !== undefined ) {
        var office = getOfficeInfo_(coordinates.lat, coordinates.lng);
        var forecastUrl = office.properties.forecast;
        var city = office.properties.relativeLocation.properties.city;
        var state = office.properties.relativeLocation.properties.state;
        var citystate = city + ', ' + state;
        var forecast = getWeatherForecast_(forecastUrl);
        return {
          forecast: forecast,
          citystate: citystate
        };
      } else {
        return null;
      }
    }

    /**
     * Calculates the weather for a location for the Weather calculated model.
     * @param {Query} query Query object owned by the datasource.
     * @return {Array<Weather>} set of records for the Weather datasource.
     */
    function calculateWeatherModel_(query) {
      var location = query.parameters.Location;
      var response;
      try {
        response = getWeather_(location);
      } catch (error) {
        throw new Error('Unable to locate provided city: \"' + location + '\".');
      }

      if (response === null) {
        throw new Error('Unable to locate provided city: \"' + location + '\".');
      }

      var forecastPeriods = response.forecast.properties.periods;
      var citystate = response.citystate;

      var records = forecastPeriods.map(function (period) {
        var record = app.models.Weather.newRecord();

        record.Citystate = citystate;
        record.ShortForecast = period.shortForecast;
        record.ForecastName = period.name;
        record.DetailedForecast = period.detailedForecast;
        record.ImageUrl = period.icon;
        record.Temperature = period.temperature;
        record.TemperatureUnit = period.temperatureUnit;
        record.WindSpeed = period.windSpeed;
        record.WindDirection = period.windDirection;

        return record;
      });

      return records;
    }
    

REST 샘플 앱 사용해 보기

Google은 REST API를 호출하는 앱을 빌드하는 데 필요한 스크립트, UI 요소, 계산된 모델에 대해 자세히 알아볼 수 있도록 샘플 앱을 만들었습니다.