通过脚本

时间:2018-02-05 03:20:07

标签: google-apps-script google-sheets

我正在尝试创建一个Google脚本来访问Google Docs电子表格中的一系列单元格,这些单元格不是我自己的,而是共享的。电子表格的共享方式意味着它是公开可读的,但无法写入。 (普通用户可以评论,但不能编辑)

当我尝试运行此脚本时,出现错误:“您无权访问所请求的文档。”我已将Google Scripts授权给我的帐户,但这似乎不足以进行getValues()调用。

到目前为止,这是我的脚本:

function myFunction() {
  var spreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1g24uo61ITTveZrUGx4ZY5nMoJp-n1NCxq5r4WMhAJU0/");
  // I can access the name, this runs fine:
  Logger.log(spreadsheet.getName());
  SpreadsheetApp.setActiveSpreadsheet(spreadsheet);
  SpreadsheetApp.setActiveSheet(spreadsheet.getSheets()[0]);
  // fetch this sheet
  sheet = spreadsheet.getActiveSheet();
  var range = sheet.getRange(3,3,22,1);

  // This next line fails: 
  var slicesAndCounts = range.getValues();
  Logger.log(slicesAndCounts);
 }

(网址是实际的公开电子表格,因此此代码应按原样运行)

我是否可以通过某种方式访问​​Google脚本中的电子表格中的值?我曾经考虑过制作电子表格的私人副本,但我只需要在脚本的持续时间内使用它,我不确定我是否可以轻松创建临时副本。该解决方案似乎也有点沉重,考虑到我能够阅读电子表格,因为我可以通过浏览器或Google表格应用程序访问它。

1 个答案:

答案 0 :(得分:2)

如何使用Sheets API?在SpreadsheetApp,似乎用户无法从共享电子表格中检索值。我认为原因可能是访问令牌无法在SpreadsheetApp中使用。在我的环境中,也会出现相同的错误。所以我想建议使用Sheets API。使用Sheets API时,还会使用访问令牌。这样,用户就可以从共享电子表格中检索值。

要使用此示例脚本,请在Advanced Google Services和API控制台上启用Sheets API。

在高级Google服务中启用表格API v4

  • 在脚本编辑器上
    • 资源 - >高级Google服务
    • 启用Google表格API v4

Enable Sheets API v4 at API console

  • 在脚本编辑器上
    • 资源 - >云平台项目
    • 查看API控制台
    • 在“入门”中,单击“启用API”并获取密钥等凭据。
    • 在左侧,单击“库”。
    • 在搜索API&服务,输入"表"。然后点击Google表格API。
    • 单击“启用”按钮。
    • 如果API已启用,请不要关闭。

如果您现在使用使用Sheets API的脚本打开脚本编辑器,则可以通过访问此URL https://console.cloud.google.com/apis/library/sheets.googleapis.com/

为项目启用Sheets API

关于示例脚本:

此示例的结果与脚本的结果相同。这些值是从共享电子表格中第一张工作表的3,3,22,1范围中检索的。

  • 在此示例脚本中,它使用Spreadsheet的文件ID。在您的情况下,1g24uo61ITTveZrUGx4ZY5nMoJp-n1NCxq5r4WMhAJU0https://docs.google.com/spreadsheets/d/1g24uo61ITTveZrUGx4ZY5nMoJp-n1NCxq5r4WMhAJU0/
  • 在此示例脚本中,a1Notation用于范围。在您的情况下,getRange(3,3,22,1)C3:C24
    • 对于此脚本,当使用{ranges: "C3:C24"}时,它表示电子表格的第一张表。如果您想从超过第二张表中检索值,请使用表格sheet2!C3:C24sheet3!C3:C24
脚本:
function myFunction() {
  var spreadsheetId = "1g24uo61ITTveZrUGx4ZY5nMoJp-n1NCxq5r4WMhAJU0";
  var slicesAndCounts = Sheets.Spreadsheets.Values.batchGet(spreadsheetId, {ranges: "C3:C24"}).valueRanges[0].values;
  Logger.log(slicesAndCounts);
}

参考文献:

如果这对你没用,我很抱歉。