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

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

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

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

Google Apps Script

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

Slack

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

Q&A

解決済

1回答

1187閲覧

GASからスプレッドシートの内容をslackに投稿する際のプログラムに不具合があります

fusho

総合スコア7

Google スプレッドシート

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

Google Apps Script

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

Slack

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

0グッド

0クリップ

投稿2020/04/08 16:04

前提・実現したいこと

【実現したいこと】
google app scriptを使ってスプレッドシートの内容をslackに投稿することを目標にスクリプトを作成しています。
【やっていることとエラー内容】
スプレッドシートの既に投稿された内容に対して他のカラムにtrurを入力して、次の実行時には次の行の内容を投稿するといったスクリプトを作成しているのですが
初回の投稿時のみslackに内容が投稿されません。(2回目の実行以降は投稿されます)

エラーメッセージ

Exception: https://hooks.slack.com のリクエストに失敗しました(エラー: 400)。サーバー応答の一部: invalid_payload(応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 26、ファイル「コード」)

該当のソースコード

function myFunction() {
var url = 'incoming webhookのURL';
const sheet = SpreadsheetApp.getActiveSheet();
const lastrow = sheet.getLastRow();

for(let i=2; i<=lastrow; i++){
if(!sheet.getRange(i,4).getValue()){
sheet.getRange(i,4).setValue('true');

if(i>=lastrow){ sheet.getRange(2,4,lastrow-1).clearContent(); } break; } var message = sheet.getRange(i,1).getValue();

}

var jsondata = {
"text":message}

var param = { "method" : "post", "contentType": 'application/json', "payload" : JSON.stringify(jsondata)

};
UrlFetchApp.fetch(url,param);
}

試したこと

if文前でpayloadのための変数messageを宣言すると問題なく投稿されました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

初回は i が 2 のとき for の 1 つめの if ブロックの中に入りそのまま for を break するので、message が undefined 。

D 列に 1 つでも true があれば、var message の行が実行され、undefined にならずにすむ。

break は for または while をぬけます。 if ブロックを 1 つ抜けるという動作にはなりません。

投稿2020/04/08 16:25

papinianus

総合スコア12705

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

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

fusho

2020/04/08 16:44

papinianus様 早速ご回答いただきありがとうございます! forの中でvar messageが処理されているため、この記述だと初回は実行されないということですね。 つまり、初回に実行される処理の中でvar messageを宣言すればvar messageは問題なく実行されるという認識で合っていますでしょうか? 宜しくお願い致します。
papinianus

2020/04/09 12:40

初回に実行される処理というのが分かりません。 そもそも、どうすればいいか、についてはifの前で宣言する、という解決策を見つけていたはずです。 私が捉えた質問者様の問題点は、breakが波括弧を一つ分だけ飛び越えると間違って理解しているのではないかということです。 breakはforの外に出ます。 私の見立てではvar messageの行はtrueをセットした次の行にあるべきだと思います。 今の処理だと、いまtrueを付けた一つ前のメッセージが送られてしまう構造なので、動きとしてとても奇妙です。 例えば5つのメッセージがあるときに3つめまでtrueがあることをシートで確認して、次に送られるのは3つ目のメッセージです。3つめに送信済フラグがあるのに次は4つめではなく3つ目が送られます。全体にずれているのでその気持ち悪さに気づかないかもしれない。それが発生しているのは1つめを送るときに0個目を送ろうとしてしまう今回の事象。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問