web-dev-qa-db-ja.com

Googleスプレッドシートの「クエリ」関数をGoogle Appsスクリプトで使用できますか?

ログインしているユーザーに基づいて別のスプレッドシートからデータをフィルターするスプレッドシートをプログラムで設定する方法を探しています。

スプレッドシート内のクエリ機能を使用してこれを行うことができます。しかし、アプリのスクリプトからクエリ関数を呼び出す方法を理解できませんか?

これはできますか?サンプルコードをいただければ幸いです。ありがとう。

16
awsamar

いいえ、Google Apps Scriptからの呼び出しを可能にするQuery関数用のAPIはありません。 (実際、この方法でスプレッドシート関数を呼び出す方法はありません。)

ただし、自分で作成しなくても、同様の機能を利用できます。 2D Arrays Library には、一致する行を取得できるさまざまな「フィルター」関数が含まれています。

8
Mogsdad

それに制限があるのか​​わかりませんが......

function test () {
  var req = query("=QUERY(shopT!B2:E; \"select min(E) where (B=3 or B=4 and D=2) group by C, D\")");

  Logger.log(req);
}

function query(request) { 
  var sheet = sp.insertSheet();
  var r = sheet.getRange(1, 1).setFormula(request);

  var reply = sheet.getDataRange().getValues();
  sp.deleteSheet(sheet);

  return reply;
}
19
zizix

おそらく、式を使用すると、必要以上のことを実行できます。

function testFormula() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[1];
  var cell = sheet.getRange("A1");
  cell.setFormula("=QUERY('Sheet0'!A1:B5;\"SELECT A, B\"; 0)");
}
6
wchiquito

「filter」という名前のシートのセルで使用したいユーザーの情報がすでにある場合

この種類の式は、「template」という名前のシートに配置できます。

b1では、この式:= query(DataToFilter!A1:E、 "select A、B、C、D where D contains '"&A1& "'"、-1)

次に、このコードを使用すると、フィルターされたデータを受け取る "newFilter"という名前のシートができます。

var templateToCopy = ss.getSheetByName('template');
template.copyTo(ss).setName('newFilter');
var editFilter = ss.getSheetByName('newFilter');
//assuming the user information needed is in A5
editFilter.getRange('A1').setValue('=filter!A5');
0
Antoine Lochet

なんとかAla-SQLライブラリを使用しました。

ステップ1。

ライブラリをプロジェクトにコピーします。 https://raw.githubusercontent.com/agershun/alasql/develop/dist/alasql.min.js

ステップ2。

ドキュメント を注意深く読んで、準備が整いました!

ステップ3。

独自のトランスレータを作成して、シートをライブラリに接続します。もっと見てください 私の投稿の情報

それを使用する方法を示すために、カスタム関数でsqlを使用しました。

=getAlaSql(sql_text, West!A:G, East!A:G, Central!A:G)

  • sql_text「select」句でサポートされている構文を使用します。注:Ala-SQLにも更新、挿入がありますが、匿名関数はありません。
  • select Col1 from ?... union all ... select Col1 from ?は適切な構文です。 Col1-notationを使用しました。疑問符は、関数の残りの部分からのテーブルまたは変数を意味します。
  • West!A:G, East!A:G, Central!A:Gはテーブルのリストです。ライブラリは、疑問符をこの変数に置き換えます。
/*
  The code here uses http://alasql.org library:
  
  Downlaad it from here:
    https://raw.githubusercontent.com/agershun/alasql/develop/dist/alasql.min.js
  or here (not tested)
    https://cdn.jsdelivr.net/npm/alasql
    
    My sample sheet is here:
    https://docs.google.com/spreadsheets/d/1V0kHvuS0QfzgYTvkut9UkwcgK_51KV2oHDxKE6dMX7A/copy
*/

function test_AlaSqlQuery()
{
  
  var file = SpreadsheetApp.getActive();
  var sheet1 = file.getSheetByName('East');
  var range1 = sheet1.getDataRange();
  var data1 = range1.getValues();
  
  var sheet2 = file.getSheetByName('Reps');
  var range2 = sheet2.getDataRange();   
  var data2 = range2.getValues();
  
  var sql = "select a.Col1, a.Col3, reps.Col2, a.Col7 from ? a left join ? reps on reps.Col1 = a.Col3";
  var data = getAlaSql(sql, data1, data2);
  
  Logger.log(data);  

}

function getAlaSql(sql)
{
  var tables = Array.prototype.slice.call(arguments, 1);  
  var request = convertToAlaSql_(sql);
  var res = alasql(request, tables);
  //return JSON.stringify(res);
  return convertAlaSqlResultToArray_(res);
}



function test_AlaSqlSelect()
{
  var file = SpreadsheetApp.getActive();
  var sheet = file.getSheetByName('East');
  var range = sheet.getDataRange();
  var data = range.getValues();
  
  var sql = "select * from ? where Col5 > 50 and Col3 = 'Jones'"
  Logger.log(convertAlaSqlResultToArray_(getAlaSqlSelect_(data, sql)));
  /*
  [  
     [  
        Sun Jan 07 12:38:56      GMT+02:00      2018,
        East,
        Jones,
        Binder,
        60.0,
        4.99,
        299.40000000000003                                            // error: precision =(
     ],
    ...
  ]
  
  */

}


function getAlaSqlSelect_(data, sql)
{
  var request = convertToAlaSql_(sql);
  var res = alasql(request, [data]);
  // [{0=2016.0, 1=a, 2=1.0}, {0=2016.0, 1=a, 2=2.0}, {0=2018.0, 1=a, 2=4.0}, {0=2019.0, 1=a, 2=5.0}]
  return convertAlaSqlResultToArray_(res);
}


function convertToAlaSql_(string)
{
  var result = string.replace(/(Col)(\d+)/g, "[$2]");
  result = result.replace(/\[(\d+)\]/g, function(a,n){ return "["+ (+n-1) +"]"; });
  return result;
}


function convertAlaSqlResultToArray_(res)
{
  var result = [];
  var row = [];
  res.forEach
  (
  function (elt)
  {
    row = [];
    for (var key in elt) { row.Push(elt[key]); }
    result.Push(row);
  }  
  );
  return result;
}
0
Max Makhrov