GAS - 使用UrlFetchApp进行身份验证 - 表单到电子表格

时间:2016-04-23 01:38:26

标签: google-apps-script

我正在测试UrlFetchApp的功能,并从Form及其电子表格传递数据。我知道可以用另一种方式做到这一点,但是我正在google脚本本身测试UrlFetchApp的功能(第一次使用它),并希望让它能够使用这种方法。

这是我得到的场景,将绑定脚本添加到表单应用程序中:

function makeRequest() 
{
  var webAppUrl = "https://script.google.com/macros/s/WebAppID/exec";

  var auth = ScriptApp.getOAuthToken();
  var header = { 'Authorization': 'Bearer ' +  auth };
  var options = { 'method':'post', 'headers':header };

  var resp = UrlFetchApp.fetch(webAppUrl, options);

  Logger.log(resp);
}

将绑定脚本添加到附加的电子表格中:

function doPost()
{  
  var ss = SpreadsheetApp.openById('ssID');
  var name = ss.getName();
  return ContentService.createTextOutput(name);
}

然后将附加到工作表的第二个脚本作为Web应用程序发布,只有我自己才能访问。

目前上面的代码不起作用。脚本的表单一侧出现以下错误:

  

请求失败   https://script.google.com/macros/s/WebAppID/exec   返回代码401.截断的服务器响应:   未经授权

未经授权

错误401

   (使用muteHttpExceptions选项检查完整响应)(行   12,文件"代码")

UrlFetchApp代码行失败。

但是,如果我删除标题选项,然后发布Web应用程序供公众使用,这可以正常工作。显然这不是必需的。

关于我拥有的脚本之间的身份验证,我缺少什么?

附注:

任何人都知道为什么SpreadsheetApp.getActiveSheet()在以这种方式运行时不起作用?那个脚本直接绑定到谷歌表,所以很奇怪。

2 个答案:

答案 0 :(得分:3)

好的,找到了我自己的问题的答案。真的很简单。需要将以下范围添加到我的项目中以访问电子表格:

  

https://www.googleapis.com/auth/drive

我发现这样做的最简单方法是添加一个这样的简单函数并调用它:

function authorizeDrive()
{
  var forScope = DriveApp.getRootFolder();
}

不需要返回或执行任何操作,只需从DriveApp调用任何方法即可。一旦运行,它就会弹出一个授权对话框。每次进行主要方法调用时,都不需要调用它。甚至不需要在脚本中编码。我想知道是否有办法从属性窗口简单地添加项目所需的范围(我没有找到任何)。或者也许是一种传递参数和UrlFetchApp关于需要授权的范围的方法。

购买无论如何这仍然不是太糟糕。

关于我的附注,我仍然没有找到为什么SpeadsheetApp.getActiveSheet()返回null或undefined的原因。我必须通过ID或URL打开,这很痛苦。特别是因为这是一个容器绑定脚本。还注意到Logger.log()在以这种方式运行时实际上并没有向Logger添加任何内容。如果有人还能对这两者中的任何一个有所了解,那就太棒了。

答案 1 :(得分:0)

您需要获取电子表格'首先是对象。

SpeadsheetApp.getActive().getActiveSheet() 

但是,如果您要创建附加菜单,则可以使用' SpreadsheetApp.getActiveSheet()'

function myFunction() {
  var lastRow = SpreadsheetApp.getActiveSheet().getLastRow();
  var range = SpreadsheetApp.getActiveSheet().getRange(lastRow, 1, 1, 26);
  SpreadsheetApp.setActiveRange(range);
}

function onOpen(e) {
  SpreadsheetApp.getUi().createAddonMenu()
      .addItem('showLastRow', 'myFunction')
      .addToUi();
}