🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

Q&A

解決済

1回答

2237閲覧

SlackのSlash CommandsとGASを使って大量のデータが有るスプレッドシートの欲しい値を短時間で取ってくる方法

onionkenshi

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2021/01/23 07:30

前提・実現したいこと

SlackのSlash CommandsとGASを使ってスプレッドシートの欲しい値を取ってくる

ここに質問の内容を詳しく書いてください。
該当ユーザの行を検索する際に、シートの後半のユーザーだと検索し終わるまでに時間がかかり、Slash Commands上でエラーメッセージとなってしまいます。

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

Slackbot 16:20 /**** はエラー「operation_timeout」により失敗しました

該当のソースコード

GoogleAppsScript

1function doPost(e) { 2 var verificationToken = e.parameter.token; 3 if (verificationToken != '****************') { // AppのVerification Tokenを入れる 4 throw new Error('Invalid token'); 5 } 6 7 // Slackコマンドのパラメータ(該当ユーザのメールアカウント)取得 8 var useraccount = e.parameter.text; 9 10 // シート取得 11 var sheet = SpreadsheetApp.getActiveSheet(); 12 13 // 検索列指定(今回はC列) 14 var col = 'C'; 15 16 // 該当ユーザの行を検索 17 for(var i=1;i<='100';i++){ 18 if(sheet.getRange(col+i).getValue() === useraccount){ 19 20 // 該当ユーザがある行を取得 21 var userrow = i; 22 23 // 該当ユーザの各サービスのアカウント権限値を取得 24 var valD = sheet.getRange('D'+userrow).getValue(); 25 var valE = sheet.getRange('E'+userrow).getValue(); 26 var valF = sheet.getRange('F'+userrow).getValue(); 27 var valG = sheet.getRange('G'+userrow).getValue(); 28 29 // 結果を取得 30 var kekka1 = useraccount+'が持っているアカウントは↓ '+'(★:オーナー ◎:admin ◯:user)'+' \n'+'Slack'+' : '+valD+' \n'+'GSuite'+' : '+valE+' \n'+'Docbase'+' : '+valF+' \n'+'Jira'+' : '+valG; 31 32 // 結果をSlackに返す 33 var response = {text: kekka1}; 34 return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); 35 } 36 } 37 38 //該当ユーザがいなかった場合の内容をSlackに返す 39 var kekka2 = useraccount+' のユーザーはいません' 40 var response = {text: kekka2}; 41 return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); 42} 43

試したこと

  • 考えていること

シートの値を1つ1つ検索しているため膨大な時間がかかっている。
なので、「シートの値を一気に取得してそこに該当のユーザーがいるかいないか?」のフローに書き換えた方がいい

  • 困っていること

力不足でどう書き換えれば正しいかが分からないです...

補足情報(FW/ツールのバージョンなど)

これを参考に作っています。https://qiita.com/akibin/items/d7bda60b038890d770b7

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記のように、最初に100セル分の値を一括して読み込んでおき、
その値を比較するのはどうでしょうか。

差分

diff

1 // 該当ユーザの行を検索 2- for(var i=1;i<='100';i++){ 3- if(sheet.getRange(col+i).getValue() === useraccount){ 4+ var data = sheet.getRange("C1:C100").getValues(); 5+ for(var i=0; i<100; i++){ 6+ if(data[i][0] === useraccount){ 7 8 // 該当ユーザがある行を取得 9- var userrow = i; 10+ var userrow = i+1;

 
全体

function doPost(e) { var verificationToken = e.parameter.token; if (verificationToken != '****************') { // AppのVerification Tokenを入れる throw new Error('Invalid token'); } // Slackコマンドのパラメータ(該当ユーザのメールアカウント)取得 var useraccount = e.parameter.text; // シート取得 var sheet = SpreadsheetApp.getActiveSheet(); // 検索列指定(今回はC列) var col = 'C'; // 該当ユーザの行を検索 var data = sheet.getRange("C1:C100").getValues(); for(var i=0; i<100; i++){ if(data[i][0] === useraccount){ // 該当ユーザがある行を取得 var userrow = i+1; // 該当ユーザの各サービスのアカウント権限値を取得 var valD = sheet.getRange('D'+userrow).getValue(); var valE = sheet.getRange('E'+userrow).getValue(); var valF = sheet.getRange('F'+userrow).getValue(); var valG = sheet.getRange('G'+userrow).getValue(); // 結果を取得 var kekka1 = useraccount+'が持っているアカウントは↓ '+'(★:オーナー ◎:admin ◯:user)'+' \n'+'Slack'+' : '+valD+' \n'+'GSuite'+' : '+valE+' \n'+'Docbase'+' : '+valF+' \n'+'Jira'+' : '+valG; // 結果をSlackに返す var response = {text: kekka1}; return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); } } //該当ユーザがいなかった場合の内容をSlackに返す var kekka2 = useraccount+' のユーザーはいません' var response = {text: kekka2}; return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON); }

投稿2021/01/23 09:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

onionkenshi

2021/01/24 04:55

ありがとうございます! getValues()で値を複数取得し、その中で比較するやり方で解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問