LoginSignup
9
9

ESP8266/ESP32でGoogleSpreadSheetのセルを更新する

Last updated at Posted at 2018-08-14

ESP8266/ESP32でGoogleSpreadSheetのセルを更新するならIFTTTがあります。
僕は今後の事も考えてGoogle Apps Scriptで更新することにしました。
Google Apps Scriptは、Googleサービスに対して色々出来そうなので、
ESP8266からのアクセス方法を知っておくのは良さそうです。

#使うもの
  ArduinoIDE - ESP8266/ESP32
  Google Apps Script
  Google Spreadsheet
  Sujay Phadkeさん作 HTTPSRedirect リンク

  HTTPSRedirectは任意のセルを更新するサンプルが無いので作ってみました。

#ESP8266/ESP32からGoogle Apps Scriptを呼ぶ
 GScriptId = Script作成で紹介されるIDをセットします。
 JSON形式データ = Scriptのfunction doPost(e)コードを見れば判ると思います
  command = 'cellUpdate'  コマンド名です
  sheet_id          スプレッドシートIDです。
  sheet_name         シート名です。 (全角文字未対応)
  cellPosition        更新するセルの位置です
  values           更新内容です。
                 Scriptの内容だと、一度で複数のセルを更新することもできますね。

#ESP32で使う方法
  HTTPSRedirect.hソースでコメントされているstop()を動作する様にします。
//stop(); // may not be required

#Google Scriptのソース

GoogleScript.gs
function onOpen(){
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('ESP8266 Logging')
  .addItem('Clear', 'Clear')
  .addToUi();
}

function Clear(){
  sheet.deleteRows(4, sheet.getLastRow());
  SS.toast('Chart cleared', 'ESP8266 logging', 5);
}

function doPost(e) 
{
  var parsedData;
  try { parsedData = JSON.parse(e.postData.contents); } 
  catch(f){ return ContentService.createTextOutput("JSONデータの解釈が出来ません。: " + f.message); }

  if ( parsedData.command !== "cellUpdate" )
  {
    return ContentService.createTextOutput("Error! Request body empty or in incorrect format.");
  }

  var spreadSheetID = SpreadsheetApp.openById(parsedData.sheet_id);
  var sheet         = spreadSheetID.getSheetByName(parsedData.sheet_name);
  var cellPosition  = parsedData.cellPosition;
  sheet.getRange(cellPosition).setValue(parsedData.values);
  SpreadsheetApp.flush();
  return ContentService.createTextOutput( "Success" );
}

function doGet(e){
    return ContentService.createTextOutput("unknown" + e.parameter.value);
}

#ESP8266のソース
loop関数の中で更新していますが、ここまでやった関数化しても良さそうですね。

#include <ESP8266WiFi.h>
#include "HTTPSRedirect.h"

// Fill ssid and password with your network credentials
const char* ssid = "guest";
const char* password = "guest";

const char* host = "script.google.com";
const int httpsPort = 443;
// Replace with your own script id to make server side changes

// google scriptのscriptID
const char *GScriptId = "==google SciptIDをセットします==";

// Fetch Google Calendar events for 1 week ahead
const String url = String("/macros/s/") + GScriptId+ "/exec?value=Hello";
const String payload_base_cell =      "{\"command\": \"cellUpdate\", \"cellPosition\": \"";
const String payload_base_sheetid =    "\",\"sheet_id\": \"";
const String payload_base_sheetname =  "\",\"sheet_name\": \"";
const String payload_base_values =     "\",\"values\": ";
const String payload_base_terminate =  "\"}";

String payload = "";

HTTPSRedirect* client = nullptr;

void setup() {
  Serial.begin(115200);
  Serial.print("Connecting to wifi: ");  Serial.println(ssid);
  Serial.flush();

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("IP address: ");  Serial.println(WiFi.localIP());
}

int count;

void loop() {
bool flag;
char stringCount[10];
  sprintf( stringCount, "%d", count);
  count++;
  // Use HTTPSRedirect class to create a new TLS connection
  client = new HTTPSRedirect(httpsPort);
  client->setPrintResponseBody(true);
  client->setContentTypeHeader("application/json");
  Serial.print("Connecting to ");  Serial.println(host);
  // Try to connect for a maximum of 5 times
  flag = false;
  for (int i=0; i<5; i++){
    int retval = client->connect(host, httpsPort);
    if (retval == 1) {
       flag = true;
       break;
    }
    else
      Serial.println("Connection failed. Retrying...");
  }
  if (!flag){
    Serial.print("Could not connect to server: ");
    Serial.println(host);
    Serial.println("Exiting...");
    return;
  }
  // Send memory data to Google Sheets
  payload = payload_base_cell + "G6";
  payload = payload + payload_base_sheetid + "==Google SpreadsheetのIDをセットします==";
  payload = payload + payload_base_sheetname + "sheet1";
  payload = payload + payload_base_values + "\"" + stringCount + payload_base_terminate;
  Serial.println("==POSTCOMMAND==============================");
  Serial.println( payload );
  client->POST(url, host, payload, false);
  Serial.println("==POSTCOMMAND==============================");
  // delete HTTPSRedirect object
  delete client;
  client = nullptr;

  delay(60000);
}

昔は
  本当はESP32対応のArduinoIDEソースで作りたかったのですけど、動きそうなソースなのに動かない。
  僕はHTTPSをマトモに理解していないので、断念しました~ ><

今は
  HTTPSRedirectがESP32に対応してくれてます。
  私のESP8266向けコードも周辺コードをESP32化するだけで動作しました。
  サンプルソースはESP8266向けですがinclude文を変更する程度でESP32も動作すると思います

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9