Google Apps 脚本 - 检查表是不是存在,如果存在则将其删除,检查删除作业是不是完成

Posted

技术标签:

【中文标题】Google Apps 脚本 - 检查表是不是存在,如果存在则将其删除,检查删除作业是不是完成【英文标题】:Google Apps Script - check if table exist, delete it if it does exist, check if the delete job finishedGoogle Apps 脚本 - 检查表是否存在,如果存在则将其删除,检查删除作业是否完成 【发布时间】:2018-07-19 23:45:16 【问题描述】:

我正在尝试查找 Google Apps 脚本 -> 高级服务 -> BigQuery 的完整参考资料。 Apps Script BigQuery reference 只给出了一些样本,没有涵盖所有的方法。 我们应该检查方法参数的 API 引用。

这是我想做的事

    检查表是否存在 如果存在则删除 检查删除作业是否完成

检查表是否存在

如果存在则删除

我找不到检查表是否存在的方法。所以我必须继续删除表(不管它是否存在),将删除包装在一个 try 块中。

try 
  var deleteResults = BigQuery.Tables.remove(project, dataset, table);
  Logger.log(deleteResults);   
 catch (err)
  //return false;


这是执行“检查表是否存在,如果存在则删除它”任务的正确方法吗?

检查删除是否完成

现在,我想知道这份工作是否开始于

BigQuery.Tables.remove(project, dataset, table);

已经完成,但Logger.log(deleteResults); 只记录了null

[18-07-19 14:12:24:927 PDT] null

所以BigQuery.Tables.remove 方法没有返回任何东西?如何知道删除作业是否完成?

【问题讨论】:

为什么不使用DROP TABLE IF EXISTS 声明? 但问题很可能会保持不变 - “我怎么知道删除作业是否完成?” :o) 【参考方案1】:

如文档中所述,“高级服务”只是相关 Google API 的包装器。因此,您不会在 Apps Script 中找到有关高级服务的文档,因为这些方法在相应的 API 页面上有详尽的详细说明。您可以使用编辑器内自动完成来确定方法签名,或关注Google's tips

您可以通过listing all tables in your project & dataset 确定表是否存在,然后检查相关属性(idfriendlyNametableReference.tableId 等),或者直接尝试get 并处理相关错误(如果它不存在)。如果您的唯一目标是在它存在时将其删除,那么您的 try/catch 方法是最简单的。根据table#delete 的 API 文档,如果成功,您会得到一个空响应。


一个使用 BigQuery.Tables.list 方法的示例 Apps 脚本,该方法使用 partial responses 也就是 "fields" 可选参数:

function getAllTables(projectId, datasetId) 
  const options = 
    fields: "nextPageToken,tables(id,friendlyName,tableReference/tableId)"
  

  // Collect all tables - there may be more than one page's worth!
  const tables = [];
  do 
    var search = BigQuery.Tables.list(projectId, datasetId, options);
    options.pageToken = search.nextPageToken;
    if (search.tables && search.tables.length)
      Array.prototype.push.apply(tables, search.tables);
   while (options.pageToken);

  return tables;

通过patch重命名的示例:

function renameTable(newName, projectId, datasetId, tableId) 
  // The fields and associated new values we're setting.
  const resource = "friendlyName": newName;
  var response = BigQuery.Tables.patch(resource, projectId, datasetId, tableId);
  // Log the updated table metadata in Stackdriver.
  console.log(response);

(如果您使用update,则需要提供所需的完整表格,而不仅仅是您要更改的表格。)

【讨论】:

以上是关于Google Apps 脚本 - 检查表是不是存在,如果存在则将其删除,检查删除作业是不是完成的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps脚本未检测到当前行

链接到 Google Apps 脚本中的另一个 HTML 页面

从工作表中的 Google Apps 脚本访问 BigQuery 时需要登录错误

如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表

计算工作表中的行数,然后使用 Google Apps 脚本在 Google 电子表格上减去

Google Apps 脚本按钮:我可以分配一个未附加到工作表的“全局”脚本吗?