スプレッドシートのデータをslackの指定チャンネルに投稿するスクリプトなのですが、
どうも遅いです。
早くできる箇所があればお教えください。
【概要】
Googleフォームからの回答結果がリンク先のスプレッドシートに集約されます。
1時間に60回答程です。
データ項目数が多い為、データを分けてimportrangeで複数の別ファイルに読み込ませています。
集計結果や投稿内容そのもの等、結果を文字列結合させたセル内容をslackの指定チャンネルに投稿させています。
スクリプトを埋め込んでいる(バインドさせている)ファイルには、queryやimportrange等を多用していますので、
そもそもこの時点で処理に時間が掛かっていることは承知しております。
処理は指定シートで行っており、目視ではデータは表示されているのですが、
処理が遅く、かつ回答も随時増える為、処理が遅延してしまっています。
出来れば投稿から数分以内にはslack投稿させたいです。
※ライブラリとしてSlackAppを使用しています。
function doPost() {
var token = PropertiesService.getScriptProperties().getProperty('SLACK_ACCESS_TOKEN');
var app = SlackApp.create(token);
var message;
var bot_name = "slackのbot名称";
var bot_icon = "https://xxxx.png";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名を指定しています。");
var columnIVals = sheet.getRange('I:I').getValues(); // I列の値を配列で取得
var ILastRow = columnIVals.filter(String).length; //空白を除き、配列の数を取得
Logger.log(ILastRow);
for(var i = 1; i <= ILastRow; i++) {
if(!sheet.getRange(i, 12).getValue()){
message = sheet.getRange(i, 11).getValue();
sheet.getRange(i, 12).setValue(true);
Logger.log(message);
var branch = sheet.getRange(i,8).getValue();
Logger.log(branch);
if(branch=="A支店")
{
app.postMessage("#A支店チャンネル", message, {
username: bot_name,
icon_url: bot_icon,
})
}
else if(branch=="B支店")
{
app.postMessage("#B支店チャンネル", message, {
username: bot_name,
icon_url: bot_icon,
})
}
else if(branch=="C支店")
{
app.postMessage("#C支店チャンネル", message, {
username: bot_name,
icon_url: bot_icon,
})
}
else{
app.postMessage("#テスト用チャンネル", message, {
username: bot_name,
icon_url: bot_icon,
})
}
}
}
};
以上です。どうぞよろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
ほんとにこのコードの実行が「数分以内」を超えるほど遅延していると仮定したうえでの回答。
遅いのは
for(var i = 1; i <= ILastRow; i++) {
if(!sheet.getRange(i, 12).getValue()){ //12列目(L列)に処理が終わるとTRUEを入れるようにしています。ブランクの時にforが動作します。
message = sheet.getRange(i, 11).getValue();
sheet.getRange(i, 12).setValue(true);
ここです。
forの内部でapiコールをしているので、遅いです。forの手前でRangeに対してgetValuesをしてobject[][]にして、これをループすれば早くなると思います。
また、スラックへの投稿も同期的に待つので、支店ごとにまとめて投稿すれば、それはそれで早くなると思います。
そもそも集計をしていなくて、かつ時間差なく知りたいという話からすれば、フォームに投稿がある都度スラックに投げるスクリプトを書いて、フォーム送信時トリガーをかければよいはず。なぜそうしないのかわからないです(そうすれば毎回過去の回答をスキップしたり、過去の回答にtrueを書いたりしなくてすむ)。
このシート内にimportxmlがないなら、他のシートにあっても処理には影響しないと思います。
余談ですが、処理が数分を超えて長ければgsuiteだとしても打ち切られるはず(具体的な制限は覚えてないので切られてないだけかも)なので、ほんとにこれが遅いのかは計測すべき(推測するな計測せよは工学の基本なので)。
関連してなんでdoPostなのかわからないんですが、時間主導トリガーの間隔を狭めりゃいいのでは?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
Logger.log
が実際の稼動で不要であれば消すと良いです。branch
を評価するif文のところで、支店名の評価をあいまいな評価==
にしていますが、この評価式はやや遅いです。文字列が入っているとわかりきっているのであれば、厳密な評価===
にすると少しは早くなります。app.PostMessage()
に渡す、username
とicon_url
は、どの処理でも常に同じでしょうか?であれば、このオブジェクトを変数に入れて使い回せば少し早くなります。- if文が3分岐以上あると言うことですから、
switch~case
を使った方が良いと思います。
こういうのは割とちりつもですので、普段から気をつけてみると良いかもしれませんね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
alphase
2019/05/16 18:20
コードのインデントをもう少し綺麗にしていただけないでしょうか?それぞれ閉じかっこがどこにあるのかちょっとわかりにくいです。
この投稿は削除されました
tak123
2019/05/20 14:57
すみません!インデントが反映されないので、削除依頼しております。
tak123
2019/05/20 15:14
自己流で申し訳ありませんが、インデントを反映してみました。
よろしくお願いいたします。
macaron_xxx
2019/05/21 09:24
あなたの自己流のインデント辞めたほうがいいですよ。
まったく意味がわからないインデントです。
tak123
2019/05/21 10:17
macaron_xxxさん、ありがとうございます。
直してみました。いかがでしょうか?
macaron_xxx
2019/05/21 10:30
多少マシになりましたけど…。
GASのスクリプトエディタを使っているのであれば、Shift+Tabで自動インデントしてくれるので、それを利用してください。