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

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

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

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

Google Apps Script

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

Slack

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

Q&A

解決済

1回答

1671閲覧

Google Apps Script 実行時に「undefined からプロパティ「1」を読み取れません。」というエラーが発生する

euqina_sk

総合スコア11

Google スプレッドシート

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

Google Apps Script

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

Slack

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

0グッド

0クリップ

投稿2021/04/18 02:17

編集2021/04/18 03:19

前提・実現したいこと

※当方初心者です。
実現したいことを検索⇒コードのコピペ・改変で何とか乗り切ってきたのですが、エラー発生時の対応が分からずこちらに質問させていただきます。
何卒宜しくお願い致します。

googleスプレッドシートにまとめられている社内の未解決案件を、Google Apps ScriptとslackのAPI連携(incoming Webhook)を使い、毎月決まった日付に特定のslackのチャンネルに投稿したいと考えています。

未解決案件は部署ごとにあり、それぞれ異なるslackのチャンネルに投稿したいと考えています。

■スプレッドシートの内容
a.  未解決案件の番号や期限、担当者の内容等が記載された、部署ごとのシート。
シート1行目はA1セルにシートタイトル。
2行目は各項目の内容(「番号」「期限」「担当」など)。
3行目以下に具体的な案件の一覧が追加・更新されていく。
1・2行目までのフォーマットは全部署共通。
各シートの名前は部署名(営業1課、営業2課など)を記載。

b. aの各シート名(営業1課、営業2課など)と、slack投稿先のチャンネルのURLを紐付けるシート。
シート1行目は各項目の内容。
1列目「aのシート名」
2列目「投稿先のslackチャンネル名」
3列目「投稿先のslackチャンネルのURL」
4列目「各営業部のslackユーザーグループメンション」
シート2行目以下に、具体的なaのシート名や、それに紐づくURL等の情報を記載しています。
イメージ説明

最終的に、Google Apps Script上で日付ベースのトリガーを設定し、
期日になったら、bシートで設定したslackの各部署ごとのチャンネルに、
各aシートの詳細一覧が投稿されるのが理想です。

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

undefined からプロパティ「1」を読み取れません。 ※エラー箇所としては 52行目 createMessagetest 6行目 main との付記がありました。

該当のソースコード

Google Apps Script

function main(){ var sheet_to = SpreadsheetApp.openById('【スプレッドシートのID】').getSheetByName('【bのシート名】'); // var row_to = sheet_to.getDataRange().getLastRow(); var address = sheet_to.getRange(2,1,row_to-1,4).getValues(); var message = createMessagetest(row_to-2,address); sendMessagetest(row_to-2,address,message); } function sendMessagetest(rr,aa,m) { //Webhook URLを以下に入力 for(i=0;i<=rr;i++){ const sendMessage = m[i][1]; const jsonData = { "text": sendMessage, "username" : "【bot名】", "icon_emoji" : ":loudspeaker:", }; const payload = JSON.stringify(jsonData); const options = { "method": "post", "contentType": "application/json", "payload": payload }; if (aa[i][0] == m[i][0]){ UrlFetchApp.fetch(aa[i][2], options); } } } function createMessagetest(r,a) { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var output = []; for(i=0;i<=r;i++){ var sheet = spreadsheet.getSheetByName(a[i][0]); const dataObject = new Date(); const today = Utilities.formatDate(dataObject, "JST", "MM/dd"); const columnFVals = sheet.getRange('A:A').getValues(); //A列の値を配列で取得 const lastRow = columnFVals.filter(String).length; //空白を除き、配列の数を取得 var taskList = ""; //タスクリスト for (row = 3; row <= lastRow; row++) { var Datas=sheet.getDataRange().getValues(); var status = Datas[row-1][1]; var number = Datas[row-1][0]; var customer = Datas[row-1][2]; var place = Datas[row-1][3]; var item = Datas[row-1][4]; var price = Datas[row-1][5]; var delivery_date = Datas[row-1][7]; var charge = Datas[row-1][8]; var storage = Datas[row-1][9]; // if(Date.prototype.isPrototypeOf(delivery_date)){ // delivery_date = Utilities.formatDate(delivery_date, "JST", "MM/dd"); // } //こちらについては今回のエラーには関係ないため、一旦コメント化させていただきます。 //taskListの生成 taskList = taskList + "【" + status + "】" + "\n◆担当:" + charge + " ◆納期:" + delivery_date + "\n顧客名:" + customer + "(" + number + ")" + "\n会場:" + place + " 総額:" + price + "円\n商品:" + item + "\n保管:" + storage + "\n\n"; } //最終的な出力の生成 output.push([a[i][0],String(a[i][3]) + "\n" + today + "時点の未解決案件はありません。ありがとうございます。"]) } else { output.push([a[i][0],String(a[i][3]) + "\n" + today + "時点の未解決案件リストです。\n*各案件への進捗報告、お願い致します。*\n========\n" + "```\n" + taskList + "```\n"]); } } //Logger.log(output); return output; }

試したこと

bシートに記載する部署・投稿先を1部署分のみ(2行目の1行のみ)にしたところ、エラーの発生なく投稿できました。
ただ行を増やし複数シート・投稿先を記載すると、上記のようなエラーが発生します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/18 02:57 編集

[2021/04/18 11:17時点の投稿内容に対する言及] ・ if(Date.prototype.isPrototypeOf(delivery_date)){ 以下の中括弧がきちんと対応とれておらずエラー(「SyntaxError: Unexpected token 'else'~」)になります。
euqina_sk

2021/04/18 03:20

ご迷惑をお掛けしております。 ご指摘いただいた if(Date.prototype.isPrototypeOf(delivery_date)){ delivery_date = Utilities.formatDate(delivery_date, "JST", "MM/dd"); } の箇所については、今回のエラーとは関係しないため、一旦コメント化させていただきました。 (コメント化したのちも同様のエラーが発生します)
退会済みユーザー

退会済みユーザー

2021/04/18 04:23

[2021/04/18 12:19編集時点の投稿内容に対する言及] 掲題のコードでも、ifの部分を消しただけで、elseが残っているので、「SyntaxError: Unexpected token 'else'(~)」というデータが発生しますね。 なお、こちらで上記SyntaxError:のエラーが出ないようにelseの行を削除して直して実行し、ダミーのシートにダミーのデータを作って実行してみたところ、質問にある「undefined からプロパティ「1」を読み取れません。~)」に該当するエラーは発生しませんでした。 したがって、質問に記載されている(省略された)コード内ではなく、実際に手元で実行なさっているコード(質問するときに改変した部分)の中にバグがある可能性が考えられます。 またはAA店、BB店各シートのデータに何か問題があるのかもしれません。 (こちらもエスパーではないので、開示されていない部分まではわかりかねます)
euqina_sk

2021/04/22 13:14

ご指摘ありがとうございます。 別の箇所を変更したところ解決に至りました。 ご回答くださり、ありがとうございました。
guest

回答1

0

自己解決

恐れ入ります、自己解決いたしました。
一部 const を var に変更しましたところ、正常に動作するようになりました。

const ⇒ var 変更箇所

15行目 sendMessage = m[i][1]; 前
16行目 jsonData = { 前
21行目 payload = JSON.stringify(jsonData); 前
22行目 options = { 前

function sendMessagetest(rr,aa,m) { //Webhook URLを以下に入力 for(i=0;i<=rr;i++){ const sendMessage = m[i][1]; const jsonData = { "text": sendMessage, "username" : "【bot名】", "icon_emoji" : ":loudspeaker:", }; const payload = JSON.stringify(jsonData); const options = { "method": "post", "contentType": "application/json", "payload": payload }; if (aa[i][0] == m[i][0]){ UrlFetchApp.fetch(aa[i][2], options); } } }

43行目 columnFVals = sheet.getRange('A:A').getValues(); 前
44行目 lastRow = columnFVals.filter(String).length; 前

function createMessagetest(r,a) { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var output = []; for(i=0;i<=r;i++){ var sheet = spreadsheet.getSheetByName(a[i][0]); const dataObject = new Date(); const today = Utilities.formatDate(dataObject, "JST", "MM/dd"); var columnFVals = sheet.getRange('A:A').getValues(); //A列の値を配列で取得 var lastRow = columnFVals.filter(String).length; //空白を除き、配列の数を取得

こちらの変更で想定の動作は行えるようになりました。
ありがとうございました。

投稿2021/04/22 13:13

euqina_sk

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問