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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

3回答

475閲覧

Googleスプレッドシートをもちいた時間ごとに発言するプログラムで困っています。

Tsakamoto

総合スコア6

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

2クリップ

投稿2017/09/19 04:00

編集2017/09/19 05:04

###前提・実現したいこと
今、実験環境づくりのためSlackというアプリに対して、スプレッドシート内の記された発言内容を時間ごとに発言するというプログラムをつくっています。(言語はJava Scriptを主としたGoogle App Scriptです)
スプレッドシート内では1列目に言葉2列目に時間に相当する数字がしるされています。
計っている時間と2列目の数字が一致すれば1列目の発言内容がSlackに投稿されるという形をかんがえています。
時間計測はfor文中に毎回1秒ずつsleepをかけることで実現しようとしています。

###発生している問題・エラーメッセージ

TypeError: undefined からプロパティ「(class)@ecc7b67」を読み取れません。(行 40、ファイル「mainfunc」)

と関数matchの部分のif文条件式でエラーが出てしまいます。おそらく2重配列部分で何か引っかかっているのではとおもいましたがどうしたらいいかわかりません。
###該当のソースコード

//スプレッドシート読み込みの作業をここで行う。 //実験が変わる場合にシート番号を変える必要あり!! function Script() { //取り扱いたいスプレッドシートURL var spreadSheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/1xwW9_RlJ1jMk2uKWYwkSCNR9ByOA-CZjIKNTUT4tWPI/edit#gid=0'); //シートを指定ここでは0で1ページ目のシートを対象としています。 var sheet = spreadSheet.getSheets()[0]; //最終行が何行目かを取得 lastline = sheet.getLastRow(); //2重配列でセリフと時間を取得 return sheet.getDataRange().getValues(); } //postSlackMessageでメッセージを送る。ここはうまくいっている。 function postSlackMessage(line) { var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN'); var slackApp = SlackApp.create(token); //SlackApp インスタンスの取得 var options = { channelId: "#general", //チャンネル名 userName: "takayukibot", //投稿するbotの名前 message: line //投稿するメッセージ }; slackApp.postMessage(options.channelId, options.message, {username: options.userName}); } //時間とスプレッドシートの値があっているかを確認 function match(num,cou,cell) { //ここで時間が一緒の場合にSlackに対してメッセージを送るようにしている。そして次の行へnumber++ if(cell[num][1] == cou){ postSlackMessage(cell[num][0]); num = num+1; cou = cou+1; postSlackMessage(cell[2][0]); }else{ cou = cou+1; } } function Timer() { var number = 0; var count = 0; var Cell = Script(); //setTimeoutが対応していないので、sleepで1秒ずつ止めてfor文で回す。 for(var i=0;i<=5;i++){ match(number,count,Cell); postSlackMessage(Cell[2][0]); Utilities.sleep(1000); } }

###試したこと
cell部分をグローバル変数等にしてみましたが、どうにもできずおてあげじょうたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
言語:Google apps script
スプレッドシートからのテキストエディターで書き込んでいます。

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

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

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

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

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

kei344

2017/09/19 04:46

質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
Tsakamoto

2017/09/19 04:51

すいません。今修正しました。
kei344

2017/09/19 04:52

こちらの環境では変更/修正が確認できませんでした。すみませんが、もう一度確認してもらえませんか?最近teratailで修正が保存されない事がたまにあるようなので・・・。
Tsakamoto

2017/09/19 04:56

ごめんなさい更新されていませんでしたね...今度こそ大丈夫なはずです!
kei344

2017/09/19 05:02

すみません、「質問文のコードはそれぞれ」は脱字がありました。「質問文のコード・エラーはそれぞれ」でお願いします。コードのブロックごとにそれぞれという意図ではありません、すみません。
Tsakamoto

2017/09/19 05:05

今の状態でいいでしょうか?
guest

回答3

0

自己解決

//postSlackMessageでメッセージを送る。ここはうまくいっている。 function postSlackMessage(line) { var token = PropertiesService.getScriptProperties().getProperty('OAuth_Access_Token'); var slackApp = SlackApp.create(token); //SlackApp インスタンスの取得 var options = { channelId: "#general", //チャンネル名 userName: "shiranaihito", //投稿するbotの名前 message: line //投稿するメッセージ }; slackApp.postMessage(options.channelId, options.message, {username: options.userName}); } //スプレッドシート読み込みの作業をここで行う。 //実験が変わる場合にシート番号を変える必要あり!! function Script() { //取り扱いたいスプレッドシートURL var spreadSheet = SpreadsheetApp.openByUrl(''); //シートを指定ここでは0で1ページ目のシートを対象としています。 var sheet = spreadSheet.getSheets()[0]; //最終行が何行目かを取得 var lastline = sheet.getLastRow(); //2重配列でセリフと時間を取得 var Cell = sheet.getDataRange().getValues(); var number = 0; var counter = 0; for(var i=0;i<=Cell[lastline-1][1];i++){ //cellの中身が空白つまりdefinedだとエラーが表示される。なのでlastlineから1を引く Utilities.sleep(1000); if(Cell[number][1] == counter){ postSlackMessage(Cell[number][0]); number = number+1; counter = counter+1; }else{ counter = counter+1; } //postSlackMessage(Cell[2][0]); } }

関数ごとに分けずにまとめたらうまくいきました。
お騒がして申し訳なかったです。

投稿2017/09/19 06:26

Tsakamoto

総合スコア6

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

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

0

とりあえずどこまでご自身で思ったとおりのデータが来ているかを確認してみてはいかがでしょうか。

【Class Logger  |  Apps Script  |  Google Developers】
https://developers.google.com/apps-script/reference/base/logger

投稿2017/09/19 05:17

kei344

総合スコア69357

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

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

Tsakamoto

2017/09/19 05:31

すいませんいかんせんJavascriptが初心者なもので、getlog()をどこにさしこんだらいいかよくわかってないんで、教えてもらってもよろしいでしょうか? あと、 function match(num,cou,cell) { if(cell[num][1] == cou){ 部分の cell の配列としての扱い方は何か間違っているでしょうか?
guest

0

match関数内、postSlackMessage(Cell[num][0]);Cellの1文字目が大文字であり、未定義の変数です。
(Cellcellは別の変数です)

postSlackMessage(cell[num][0]);の書き間違いではないでしょうか?

投稿2017/09/19 04:50

ku__ra__ge

総合スコア4524

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

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

Tsakamoto

2017/09/19 04:53

いろいろ修正する中で忘れていたようでした。 ただ、やはりそこに対してエラーというよりif文の条件式 if(cell[num][1] == cou) がおかしいと指摘されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問