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

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

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

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

JavaScript

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

Q&A

解決済

1回答

3703閲覧

gasでimportrange結果のデータ取得について

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

JavaScript

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

0グッド

1クリップ

投稿2018/08/02 07:14

編集2018/08/03 05:17

スプレッドシートをデータベースとして利用しWEBアプリケーションを作っています。

データを保持しているスプレッドシートをWEBアプリケーションからキーワード検索(部分一致)を行なって検索結果をHTMLに表示すると言う処理を作りました。
しかし、検索時に下記のような処理(データベースのスプレッドシートからquery関数を利用し、別のスプレッドシートに一時的に表示し、取得する処理)で結果を取得しているのですが、まれに対象件数が10件あるのに、1件しか取得できない場合があります。

原因としては、複数人が同時に使用した場合、結果を一時的に表示するスプレッドシートに何枚もシートを作成され、全てのシートがimpoertrange関数を使用しているため、結果取得に時間がかかってしまっていると思います。

私の勉強不足で、スピレッドシートをデータベースとして使用す場合の検索の仕方がこの方法か、for~ if~を使用し、1件ずつ確認する方法しか思いつかないのですが、何か別の方法はありますでしょうか?
よろしくお願いします。

記載しているコードは、検索の部分のみ抜粋しています。

JavaScript

1 2function getdata(sql){ 3 //例:sql => "SELECT * WHERE Col2 LIKE '%xxx%'" 4 5 //query関数を貼り付けるスプレッドシート 6 var query_sheet = SpreadsheetApp.openById("[query関数を貼り付けるシートID]"); 7 8 //アカウントを取得 9 var user_id = Session.getActiveUser().getEmail(); 10 11 //セルに貼り付ける関数を作成 12 var setfx = '=query(IMPORTRANGE("[データベースのシートID]","[シート名]!A:Z"),' + sql + ')' ; 13 14 //[ユーザアカウント]のシートがあるかチェック。 なければ、[null] 15 var mySheetchk = query_sheet.getSheetByName(user_id); 16 17 //シートがあった場合、既存のシートを削除 18 if(mySheetchk != null){ 19 query_sheet.deleteSheet(mySheetchk); 20 } 21 22 //[ユーザアカウント]のシートを作成し、関数を[A1]に貼り付け 23 var srcSheet = query_sheet.insertSheet(user_id); 24 srcSheet.getRange(1, 1).setValue(setfx); 25 26 //結果をの最終行を取得し、全てオブジェクト型で取得 27 var lastRow = srcSheet.getLastRow(); 28 var lastCol = srcSheet.getLastColumn(); 29 var result_Array = srcSheet.getRange(1,1,lastRow,lastCol).getValues(); 30 31 //[ユーザアカウント]のシートを削除 32 query_sheet.deleteSheet(srcSheet); 33 34 return result_Array; 35}

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

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

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

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

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

macaron_xxx

2018/08/02 07:26

getdataの引数はsqlじゃないとダメなんですか?getDataRangeしてFilterで絞ったほうがかなり効率良さそうなんですが。どういう状況で使いたいかによりますかね。
papinianus

2018/08/02 08:20 編集

macaron_xxxさんの質問と関連してきますが、検索ってどうやっているのですか(この関数の呼び出しというかsqlの作り方というか)?というかこの関数をどう実行しているのでしょう? "query()"が遅いこと、はユーザサイドではどうしようもないように思いますので、他の方法を探すとして。
退会済みユーザー

退会済みユーザー

2018/08/03 05:18

すみません。私の説明不足です。GASでWEBアプリケーションを作って、作成したWEB画面上から実行すると言う流れです。質問を追記しましたので確認いただけると幸いです。
macaron_xxx

2018/08/03 05:45

ということは、Webからのインプットはキーワードのみなんですよね?Webからのインプットを受け取って、sqlを作成しているfunctionやgetdataを呼び出しているfunctionも記載してください。SQLを作成せずにスプレッドシートから対象のデータのみ取得するfunctionはもっと簡易的に作れるはずです。
guest

回答1

0

ベストアンサー

二次元配列(スプレッドシートのデータのような)をn番目のcolumnで絞りこむ関数はこのように定義できます。

javascript

1function filterJagArray(haystack, coln, needle) { 2 return haystack.filter(function(element, index, array) { 3 return element[coln].indexOf(needle) > -1; 4 }); 5}

そのうえで、getdatasを概念的にこうしたらいいんじゃないかと思います。

javascript

1function getdata(needle){ //sqlではなくlike文の探したい部分だけもらう 2 3 //データベースのスプレッドシート 4 var datasheet = SpreadsheetApp.openById("[データベースのシートID]"); 5 var all = datasheet.getDataRange().getValues(); 6 7 return filterJagArray(all, 1/*2番目のカラムは1(0始まりなので)*/, needle); 8} 9

投稿2018/08/03 14:53

編集2018/08/03 14:55
papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問