Opciones de datos externos

Recomendamos que tus apps usen Google Cloud SQL para almacenar datos. Sin embargo, tu app también puede realizar estas acciones:

  • escribir datos en una base de datos de MySQL externa con JDBC. La API de JDBC es un estándar de la industria que se usa para conectar aplicaciones a bases de datos.
  • usar las solicitudes HTTP y las API de REST.

Almacena datos en una base de datos externa

Puedes crear una app que use el servicio de JDBC de Apps Script para almacenar datos en una base de datos que no sea de MySQL de Google. Por ejemplo, puedes usar una secuencia de comandos para escribir una fila de datos en una base de datos externa de esta forma:

// 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();
}

Obtén más información sobre cómo escribir en una base de datos externa y leer de ella.

Prueba la app JDBC de muestra

Creamos una app de muestra para que puedas obtener más información sobre las secuencias de comandos, los elementos de IU y los modelos calculados necesarios a fin de compilar una app que lee y escribe datos a una base de datos que no es de MySQL de Google. Revisa el README de la app para descubrir cómo personalizar la app a fin de conectarla a tu base de datos.

Llama a los servicios de REST

Puedes crear una app que recupere información de servicios de terceros con la API de Transferencia de estado representacional (REST). Por ejemplo, con la secuencia de comandos siguiente, se toma una ubicación que ingresa el usuario y solicita el pronóstico del tiempo para esa ubicación a un servicio externo:

/**
 * 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;
}

Prueba la app de REST de muestra

Creamos una app de muestra para que puedas obtener más información sobre las secuencias de comandos, los elementos de IU y los modelos calculados necesarios a fin de compilar una app que llame a las API de REST.