質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

12522閲覧

GoogleAppsScript(GAS)において”スクリプト関数が見つかりません: doGet”とエラーが出て困っています

aRyo

総合スコア23

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/08/27 10:57

編集2021/08/27 12:16

Arduino(ESP)を用いて気温,湿度,気圧のデータをGoogleスプレッドシートに記録するといったプログラムを作成中です。
その際に、GoogleAppsScript(GAS)でコードを入力して公開後デプロイすると”スクリプト関数が見つかりません: doGet”とエラーが出ます。
GoogleAppsScript(GAS)自体初めて使用するのでどこが誤っているかわからない状態です。
以下、コードになります。

var id = 'スクリプト IDを入れてます'; function doGet(e) { if (e.parameter == undefined) { result = 'Parameter undefined'; } else { var sheet = SpreadsheetApp.openById(id).getActiveSheet(); var newRow = sheet.getLastRow() + 1; // 次の行に入力する var rowData = []; rowData[0] = new Date(); //タイムスタンプ for (var param in e.parameter) { var value = e.parameter[param]; rowData[parseInt(param)] = value; } var newRange = sheet.getRange(newRow, 1, 1, rowData.length); newRange.setValues([rowData]); var result = 'Ok'// Text des Anworts } return ContentService.createTextOutput(result);

データを送らずデプロイすると日付だけ入力されるはずですが、どこが誤っていますでしょうか。
ご教授ください。よろしくお願いいたします。

追記

Arduinoに実際に書き込みしたコードが以下になります。
これを実行するとGoogleスプレッドシートに記録が始まると思ったのですが何も反応がありません。
事前にGoogleスプレッドシートでシートを作成しておく必要があるのでしょうか。
よろしくお願いいたします。

/* BME280I2C Modes.ino This code shows how to use predefined recommended settings from Bosch for the BME280I2C environmental sensor. GNU General Public License Written: Dec 30 2015. Last Updated: Sep 23 2017. Connecting the BME280 Sensor: Sensor -> Board ----------------------------- Vin (Voltage In) -> 3.3V Gnd (Ground) -> Gnd SDA (Serial Data) -> A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro SCK (Serial Clock) -> A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro */ #include <BME280I2C.h> #include <Wire.h> // Needed for legacy versions of Arduino. #include <WiFiClientSecure.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define SERIAL_BAUD 115200 const char* ssid = "********"; const char* password = "********"; const char* server = "script.google.com"; const char* key = "********"; // google script key WiFiClientSecure client; float temp(NAN), hum(NAN), pres(NAN); /* Recommended Modes - Based on Bosch BME280I2C environmental sensor data sheet. Weather Monitoring : forced mode, 1 sample/minute pressure ×1, temperature ×1, humidity ×1, filter off Current Consumption = 0.16 μA RMS Noise = 3.3 Pa/30 cm, 0.07 %RH Data Output Rate 1/60 Hz Humidity Sensing : forced mode, 1 sample/second pressure ×0, temperature ×1, humidity ×1, filter off Current Consumption = 2.9 μA RMS Noise = 0.07 %RH Data Output Rate = 1 Hz Indoor Navigation : normal mode, standby time = 0.5ms pressure ×16, temperature ×2, humidity ×1, filter = x16 Current Consumption = 633 μA RMS Noise = 0.2 Pa/1.7 cm Data Output Rate = 25Hz Filter Bandwidth = 0.53 Hz Response Time (75%) = 0.9 s Gaming : normal mode, standby time = 0.5ms pressure ×4, temperature ×1, humidity ×0, filter = x16 Current Consumption = 581 μA RMS Noise = 0.3 Pa/2.5 cm Data Output Rate = 83 Hz Filter Bandwidth = 1.75 Hz Response Time (75%) = 0.3 s */ BME280I2C::Settings settings( BME280::OSR_X1, BME280::OSR_X1, BME280::OSR_X1, BME280::Mode_Forced, BME280::StandbyTime_1000ms, BME280::Filter_Off, BME280::SpiEnable_False, BME280I2C::I2CAddr_0x76 // I2C address. I2C specific. ); BME280I2C bme(settings); ////////////////////////////////////////////////////////////////// void setup() { Serial.begin(SERIAL_BAUD); while(!Serial) {} // Wait Wire.begin(); while(!bme.begin()) { Serial.println("Could not find BME280I2C sensor!"); delay(1000); } switch(bme.chipModel()) { case BME280::ChipModel_BME280: Serial.println("Found BME280 sensor! Success."); break; case BME280::ChipModel_BMP280: Serial.println("Found BMP280 sensor! No Humidity available."); break; default: Serial.println("Found UNKNOWN sensor! Error!"); } // Change some settings before using. settings.tempOSR = BME280::OSR_X4; bme.setSettings(settings); } ////////////////////////////////////////////////////////////////// void loop() { printBME280Data(&Serial); delay(60000);  wifi_conect(); delay(30000); //30秒毎に書き込みする g_acsess(); } ////////////////////////////////////////////////////////////////// void printBME280Data ( Stream* client ) { BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); BME280::PresUnit presUnit(BME280::PresUnit_Pa); bme.read(pres, temp, hum, tempUnit, presUnit); client->print("Temp: "); client->print(temp); client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F')); client->print("\t\tHumidity: "); client->print(hum); client->print("% RH"); client->print("\t\tPressure: "); client->print(pres); client->println("Pa"); delay(1000); } void wifi_conect(){ WiFiServer server(80); // Wi-Fiに接続 Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); // 接続するまで待機する delay(1000); } Serial.print("Connected to "); Serial.println(ssid); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void g_acsess(){ String URL="https://script.google.com/macros/s/"; URL += key; URL += "/exec?"; URL += "&1_cell="; URL += temp ; URL += "&2_cell="; URL += hum ; URL += "&3_cell="; URL += pres ; Serial.println(URL); // サイトにアクセス Serial.println("\nStarting connection to server..."); if (!client.connect(server, 443)) Serial.println("Connection failed!"); else { Serial.println("Connected to server!\n"); client.println("GET " + URL); client.stop(); Serial.println("finish."); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/08/27 11:12

保存してデプロイしていないとか?
aRyo

2021/08/27 11:13

コメントありがとうございます。 保存は出来ていると思います。 デプロイの管理に出てくるため
YAmaGNZ

2021/08/27 11:20

ソースを保存しなくてもデプロイは可能です。 デプロイはエディタで現在編集中のコードで行われるのではなく、保存されたコードで行われます。
aRyo

2021/08/27 11:23

保存出来ていなかったみたいです 保存後、デプロイすると以下のエラーメッセージが出ます こちらの解決方法もご教授頂けないでしょうか。 エラーメッセージ その操作を実行するには承認が必要です。
aRyo

2021/08/27 11:24

あ、出来ました!!
aRyo

2021/08/27 11:28

承認はされたみたいです しかし、以下のエラーメッセージが表示されました。 TypeError: Cannot read property 'parameter' of undefined まだ試せていないのですが、このエラーメッセージはパラメータ(気温,湿度,気圧のデータ)を送ることで表示されないのでしょうか。
YAmaGNZ

2021/08/27 11:45

提示されたソースを実行してみましたが特に問題なく実行できています。 どのように実行されていますか?
YAmaGNZ

2021/08/27 12:11

wifi_conectが呼ばれていないようですがいいのでしょうか?
aRyo

2021/08/27 12:17

失礼いたしました。 追加していますが、反応はありませんでした。
YAmaGNZ

2021/08/27 12:20

ブラウザから呼び出してみるなど、動作確認は行われましたか?
aRyo

2021/08/27 12:36

今やってみたのですが、繋がらなかったです。 上記のGASのコードで問題なく実行出来たとおっしゃられてましたが、事前にGoogleスプレッドシートのシートを作成されていたのでしょうか? または実行された際にシートが作成されるのでしょうか?
YAmaGNZ

2021/08/27 12:50

スプレッドシートを作成し、そのIDを var id = 'スクリプト IDを入れてます'; この部分に設定する必要があります。 参考にされたページがあると思いますが、そこに解説はなかったのでしょうか?
aRyo

2021/08/27 13:09

参考にしたサイトは以下のサイトです https://nomad-life.net/19191277/%e6%a0%bd%e5%9f%b9-%e7%ae%a1%e7%90%86/%e3%80%90%e8%be%b2%e6%a5%ad%e3%83%87%e3%83%bc%e3%82%bf%e3%83%ad%e3%82%ac%e3%83%bc%e3%80%91%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e3%82%b9%e3%83%9e%e3%83%9b%e3%81%a7%e7%b0%a1%e5%8d%98%e8%a1%a8%e7%a4%ba/%e3%80%90%e8%be%b2%e6%a5%ad%e3%83%87%e3%83%bc%e3%82%bf%e3%83%ad%e3%82%ac%e3%83%bc%e3%80%91%e3%83%8f%e3%82%a6%e3%82%b9%e3%81%ae%e6%b8%a9%e6%b9%bf%e5%ba%a6%e3%82%92wifi%e3%81%a7%e7%ae%a1%e7%90%86#toc6 作成したシートのIDを使うんですね 初心者でなかなか理解できていない部分も多くてお手数をおかけし申し訳ございません。 最後までお付き合いしていただければ幸いです。 作成したGoogleスプレッドシートのIDでデプロイしたところ上手く日付が入力されて おりました。 しかし、実行やデプロイを管理(ウェブアプリ)のURLから行うとエラーメッセージが表示されます。 エラーメッセージ内容 Exception: SpreadsheetApp オブジェクトでの openById メソッドまたはプロパティの取得中に予期しないエラーが発生しました。(行 9、ファイル「コード」)
YAmaGNZ

2021/08/27 13:59

どうも用語を正しい意味で使用されているようなので話がうまく伝わっていないように思えます。 デプロイとはWEBアプリとして使えるようにする行為で作成したコードが実行されるわけではありません。 また発生しているエラーはスプレッドシートのIDが正しくない場合に発生するものです。 これが出るということは正しくスプレッドシートに書き込むことができないはずなので >デプロイしたところ上手く日付が入力されておりました。 という動作をするのは考えにくい状態です。 当方はArduino側に関しては詳しくないのでWEBアプリ側の動作ができるようになった後にArduinoでの実行時にうまくいかない場合に関してはお答えできないと思います。
guest

回答1

0

ベストアンサー

もしかしてエディタ上の「実行」で実行されているのでしょうか?
もしそうなのであれば、doGetの引数eはWebアプリとして呼び出される時のものとは異なります。

なのでエディタでテストしたい場合は、下記のような別関数を作ってそこからdoGetを呼び出すことで
テストできます。

function debug_doGet(){ var e = { parameter:{ } } var a = doGet(e); }

イメージ説明
このような感じで開始する関数を選んで実行すればデバッグしやすいかと思います。

投稿2021/08/27 11:59

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aRyo

2021/08/27 12:08

回答ありがとうございます。 実行で行うと以下のエラーメッセージ ”エラー Exception: Unexpected error while getting the method or property openById on object SpreadsheetApp.” デプロイで実行すると以下のエラーメッセージ ”Exception: SpreadsheetApp オブジェクトでの openById メソッドまたはプロパティの取得中に予期しないエラーが発生しました。(行 9、ファイル「コード」)” データが送信されていないためのエラーメッセージだと思い、Arduinoにコードを書き込み実行(追記情報参照)したのですが全く反応がありません。
YAmaGNZ

2021/08/27 14:10

var id = 'スクリプト IDを入れてます'; ここにスクリプトIDではなくスプレッドシートのIDを入れます。 参考にされているページから飛んだGAS周りのことを書いたページにもそのように書いてあります。
aRyo

2021/08/27 21:55

Googleスプレッドシートの問題については、解決出来ました。 URLをブラウザで行うとデータが記録されていました Arduino側のコードの問題?でArduinoから行うとうまく作動しませんでした そちらは次に質問し、こちらは質問は締め切らせてもらいます。 最後まで丁寧に教えていただき本当に感謝しています。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問