Javascript 如何使用应用程序脚本将变量插入BigQuery查询字符串?

Javascript 如何使用应用程序脚本将变量插入BigQuery查询字符串?,javascript,mysql,google-apps-script,google-cloud-platform,google-bigquery,Javascript,Mysql,Google Apps Script,Google Cloud Platform,Google Bigquery,我遇到了一个问题,我无法在谷歌的任何地方找到解决方案。 我在BigQuery中有一个表,包含150k+唯一行和29列。 每行都有一个必需的列dateX类型DATE 在我的应用程序脚本中,我从电子表格(最重要的是日期范围)中获取用户输入,在指定文件夹中创建新的电子表格,插入数据和设置格式,并将下载链接返回给用户。 我需要的“最终”功能是能够获取用户提供的日期范围值,并将它们插入到我的BigQuery查询字符串中,以便我可以从BigQuery表中仅为这些日期写入数据。 问题: 无论我如何在应用程序脚

我遇到了一个问题,我无法在谷歌的任何地方找到解决方案。

我在BigQuery中有一个表,包含150k+唯一行和29列。
每行都有一个
必需的
dateX类型
DATE


在我的应用程序脚本中,我从电子表格(最重要的是日期范围)中获取用户输入,在指定文件夹中创建新的电子表格,插入数据和设置格式,并将下载链接返回给用户。

我需要的“最终”功能是能够获取用户提供的日期范围值,并将它们插入到我的BigQuery查询字符串中,以便我可以从BigQuery表中仅为这些日期写入数据。

问题:
无论我如何在应用程序脚本中构造查询字符串,查询都不会返回任何行。只有标题。
到目前为止,我已经确定查询中的
WHERE
语句是问题所在。我尝试了以下方法:

var request = {
    query: `SELECT * FROM le.table.name WHERE dateX = '2020-10-5'`
};
//
// Some of the variations I've tried (among countless others w/ different formatting):
// 'SELECT * FROM le.table.name WHERE dateX = "2020-10-5"'
// "SELECT * FROM le.table.name WHERE dateX = '2020-10-5'"
// 'SELECT * FROM le.table.name WHERE dateX between "2020-10-5" and "2020-10-5"'
// 'SELECT * FROM le.table.name WHERE cast(dateX as date) between "2020-10-5" and "2020-10-5"'
// `SELECT * FROM le.table.name WHERE dateX = ${dateFrom}`
// `SELECT * FROM le.table.name WHERE dateX between ${dateFrom} and ${dateTo}`
//
// I've also tried setting the query string as a variable & passing with no success. 
// var queryString = 'SELECT * FROM le.table.name WHERE dateX = "2020-10-5"';
// var queryString = 'SELECT * FROM le.table.name WHERE dateX = ' + '2020-10-5';
所有这些都运行得很好。作业执行时没有错误。但它只返回标题,不返回行:(
当我直接在BigQuery中运行时,相同的查询运行得很好,并返回所需的行。

此外,如果我从
WHERE
中删除所有内容,它将使用我的所有150k+行运行查询。
如果选择我的列,它将返回所需的列。但不会返回所有(*)。


我不再困惑,也确实迷路了。也许我在这方面花了太多时间,我已经形成了一种隧道视觉,需要第二双眼睛来发现这个问题。非常感谢您提供的任何帮助。提前谢谢您。

如果没有样本数据,我不确定我还能说些什么。如果可能的话,也许您可以分享一些匿名版本的数据集?

我猜是一个简单的打字错误:

var request = {
    query: `SELECT * FROM le.table.name WHERE dateX = '2020-10-5'`
};

难道不是“2020-10-05”吗?

我在这个问题上睡了一觉,找到了解决问题的办法:

当直接在BigQuery中运行查询时,它非常聪明,知道“2020-10-05”实际上是一个日期,因此它以
date
格式读取它

在应用程序脚本中构造查询字符串时,整个this是一个字符串,因此“2020-10-05”也是一个字符串。这显然会导致
WHERE
返回false,因为它将dateX(日期)与字符串进行比较。
这可以通过对日期变量使用
cast()
来解决:

var request = {
    query: `SELECT * FROM le.table.name WHERE dateX between ` + 
           `cast(${dateFrom} as date) and cast(${dateTo} as date);`
}  
//
//Note: dateFrom & dateTo variables need to include ' ' in them.
//  Ex: var dateFrom = "'2020-10-05'";
//

我希望这可以帮助其他处理应用程序脚本和BigQuery的人!

额外的整数没有什么区别,因为BigQuery似乎足够聪明,可以正确解释任何一种变化(2020-10-05/2020-10-5)。但我同意第二个整数应该包含在当天,因为它的格式相同。