从另一个Apps Script项目运行Apps Script Web App时,如何以编程方式进行身份验证

阿盖尔

我是Apps脚本的新手,并试图了解使用另一个帐户在一个帐户中运行/触发脚本的基础知识。只是警告:我想在用户访问脚本而不是用户拥有脚本的情况下运行脚本,以便为用户访问分配运行时间。

但是,我遇到了以下问题。


从测试SpreadSheet(共享设置为Anyone With Link)开始,可以在脚本项目页面中编辑以下代码:

function doPost(e){
  var sheet = SpreadsheetApp.openById('1tWV6ELJEGkWkSXvdf9kQemvH-tDVTx0od4JHht2ZBeU');
  var tab = sheet.getSheetByName('ref');
  tab.getRange(1,1).setValue(new Date());
  return ContentService.createTextOutput(0)
}

function doGet(e){
  return doPost(e)
}

并已将项目发布为Web App,并将执行设置为用户访问并为任何人启用访问。在浏览器中手动输入以下链接,以当前时间填充A1单元格,并按预期显示“ 0”的页面,

https://script.google.com/macros/s/AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm/exec

如果我仍然使用创建测试SpreadSheet的帐户登录,则输入链接。

如果我在没有GSuite登录的情况下使用其他浏览器输入链接,则需要登录,这也是预期的。毕竟,每个Web App部署都需要一个G Suite帐户来运行脚本。

但是,当我尝试使用其他GSuite帐户和Apps Script项目触发脚本时,仍然遇到登录页面以及其他问题。在......之外

function test1(){
  const scriptURL='https://script.google.com/macros/s/AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm/exec';  
  var response = UrlFetchApp.fetch(scriptURL)
  Logger.log(response.getContentText())
}

function test2(){
  const scriptURL='https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec';  
  var response = UrlFetchApp.fetch(scriptURL, {
    method:'POST',
    payload:'nothing'
  });  
  Logger.log(response.getContentText())
}

function test3() {
  var sheet = SpreadsheetApp.openById('AKfycbwNhYg1BRKi38pNf_z0peGuYt6gsqvauCvo-eiGgCYJJk4QDpjm');
  Logger.log(sheet.getName());
}

function test4() {
  var token = ScriptApp.getOAuthToken();
  const scriptURL='https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec';  
  var response = UrlFetchApp.fetch(scriptURL, {
    headers: {Authorization:'Bearer '+ token},
    method:'GET',
    payload:'nothing'
  });  
  Logger.log(response.getContentText())
}

test1() 在Log中生成长文本,以

Logging output too large. Truncating output. 
<!DOCTYPE html>
<html lang="en">
  <head>
  <meta charset="utf-8">
  <meta content="width=300, initial-scale=1" name="viewport">
  <meta name="google-site-verification" content="LrdTUW9psUAMbh4Ia074-BPEVmcpBxF6Gwf0MSgQXZs">
  <title>Sign in - Google Accounts</title>
  <style>

test2()返回错误

Exception: Request failed for https://script.google.com returned code 401. Truncated server response: <!DOCTYPE html><html lang="en"><head><meta name="description" content="Web word processing, presentations and spreadsheets"><meta name="viewport" c... (use muteHttpExceptions option to examine full response)
    at test2(Code:23:30)

doPost(e)由于未更新单元格A1,因此没有测试触发脚本

test1()似乎遇到了登录页面。但是,与此同时,test1()是通过登录的G Suite帐户执行的。

可能还值得注意的是,test3()它能够访问相关的Google SpreadSheet文件。我也尝试致电,ScriptApp.getOAuthToken()因为为什么不这样做。test4()与的响应相同test1()

我不知道从哪里开始进行诊断test2()


如何解决登录页面?

特别是,是否有一种方法可以使该脚本在具有相关Google SpreadSheet的访问权限的情况下,由其他GSuite帐户访问,并由用户访问而不是拥有SpreadSheet的用户来执行?

POST版本在做什么?

任何帮助都是值得的!

Tanaike

从您的问题中,我了解到您的情况如下。

  • Web Apps脚本被放入Spreadsheet of的容器绑定脚本中1tWV6ELJEGkWkSXvdf9kQemvH-tDVTx0od4JHht2ZBeU
  • 电子表格被作为共享Anyone with the linkeditor
  • Web Apps部署为Execute the app as: User accessing the web appsWho has access to the app: Anyone

这个答案是我的以上理解的前提。因此,如果我的理解不正确,请告诉我。

修改要点:

  • UrlFetchApppayload:'nothing'使用时,即使使用,它也要求作为POST方法method:'GET'请注意这一点。
  • 在您的Web Apps脚本中使用的范围https://www.googleapis.com/auth/spreadsheets在这种情况下,首先,需要通过自己的浏览器(每个用户的浏览器)对范围进行授权。如果不这样做,即使脚本和具有客户端作用域的访问令牌正确,Authorization needed也会发生错误请注意这一点。看来这是当前的规范。
  • 如果客户端的整个脚本(test1to test4)是问题中的脚本,则范围为https://www.googleapis.com/auth/script.external_requesthttps://www.googleapis.com/auth/spreadsheets我认为范围不足以请求Web Apps。例如,在这种情况下,请添加// DriveApp.getFiles()到脚本编辑器。这样,https://www.googleapis.com/auth/drive.readonly脚本编辑器会自动添加的范围,并且该范围可用于向Web Apps请求。另外,您可以使用的范围https://www.googleapis.com/auth/drive
    • 在的范围的情况下https://www.googleapis.com/auth/script.external_requesthttps://www.googleapis.com/auth/spreadsheets,的错误Unauthorized发生。

当以上几点反映到您的情况时,它将变为以下情况。

用法:

1.准备Web Apps端。(服务器端)

在这种情况下,我认为可以使用您的设置。请以新版本重新部署Web Apps,以防万一。并再次确认Web Apps的URL。

2.准备客户端。

  1. https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec使用自己的浏览器(用户端)访问。并且请授权Web Apps的范围。

  2. 我想提出test4()如下修改脚本的建议

     function test4() {
       var token = ScriptApp.getOAuthToken();
       const scriptURL='https://script.google.com/macros/s/AKfycbxay75fTBt3doTyMFUPK0-GpK9hMZ4hVkYdiwYUBMhPfEN6hUJH/exec';  
       var response = UrlFetchApp.fetch(scriptURL, {
         headers: {Authorization:'Bearer '+ token},
         method: 'GET',
     //    payload:'nothing',
         muteHttpExceptions: true
       });  
       Logger.log(response.getContentText())
    
       // DriveApp.getFiles()  // This is used for adding a scope of https://www.googleapis.com/auth/drive.readonly. This is used for requesting to Web Apps.
     }
    
  3. 请运行test4()这样,0便从Web Apps返回,您可以在日志中看到它。

参考文献:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从另一个Apps Script项目运行Apps Script Web App时,如何以编程方式进行身份验证

来自分类Dev

如何从一个Google Apps脚本调用另一个函数?

来自分类Dev

Google Apps Script - 根据另一个单元格的值设置活动单元格的公式

来自分类Dev

Google Apps Script Web App图片解决方法

来自分类Dev

App Script / Javascript用另一个数组过滤一个数组

来自分类Dev

如何在Shell Script中的另一个函数中调用一个函数?

来自分类Dev

如何将一个“do shell script”的输出用于Applescript中的另一个

来自分类Dev

如何使用wp_localize_script从另一个PHP文件传递参数

来自分类Dev

如何从另一个系统访问在一个系统上运行的Moqui Web应用程序

来自分类Dev

如何重用解决方案中另一个项目的Web用户控件?

来自分类Dev

从另一个匿名Web应用程序的Google Apps脚本Web应用程序获取JSON

来自分类Dev

将列表框的选定值传递给google-apps-script中的另一个列表框

来自分类Dev

如何使用 App Script 将电子邮件或帖子从 Google 群组移动到另一个 Google 群组?

来自分类Dev

如何将一个Web api控制器方法调用到另一个Web api项目中?

来自分类Dev

ASP.NET Web窗体和身份:将IdentityModels.cs移至另一个项目

来自分类Dev

尝试从另一个窗口追加ChildHTML对象时,Internet Explorer抛出SCRIPT5022:HierarchyRequestError

来自分类Dev

如何通过Python Script Mac在另一个应用程序中打开文档(例如.txt)

来自分类Dev

如何在PHP Script中插入已将前例键引用到另一个表的主键的记录?

来自分类Dev

如何从C#中的另一个项目调用或启动asp.net Web服务(asmx)

来自分类Dev

在另一个虚拟目录中运行一个项目进行调试

来自分类Dev

如何使用不同的阶段/不同的GSuite帐户开发Google Apps Script Web App?

来自分类Dev

如何使用 .net core 对来自 Ionic 的移动设备和另一个来自 Web 的移动设备进行身份验证?

来自分类Dev

使用Google Script检查一个日期是否大于另一个日期

来自分类Dev

如何在另一个电子表格中使用Google Apps脚本?

来自分类Dev

Google Apps Marketplace v2-如何使用“测试安装”以另一个测试域测试在GAMv2中创建的项目?

来自分类Dev

Google Apps脚本-如何将列复制到下一个可用列的另一个工作表

来自分类Dev

在另一个模板中下划线模板<script type =“ text / template> </ script>

来自分类Dev

在PHP文件中将cURL与Google Apps Script Web App一起使用时出现问题

来自分类Dev

如何通过域将参数传递到 Apps Script Web 应用程序?

Related 相关文章

  1. 1

    从另一个Apps Script项目运行Apps Script Web App时,如何以编程方式进行身份验证

  2. 2

    如何从一个Google Apps脚本调用另一个函数?

  3. 3

    Google Apps Script - 根据另一个单元格的值设置活动单元格的公式

  4. 4

    Google Apps Script Web App图片解决方法

  5. 5

    App Script / Javascript用另一个数组过滤一个数组

  6. 6

    如何在Shell Script中的另一个函数中调用一个函数?

  7. 7

    如何将一个“do shell script”的输出用于Applescript中的另一个

  8. 8

    如何使用wp_localize_script从另一个PHP文件传递参数

  9. 9

    如何从另一个系统访问在一个系统上运行的Moqui Web应用程序

  10. 10

    如何重用解决方案中另一个项目的Web用户控件?

  11. 11

    从另一个匿名Web应用程序的Google Apps脚本Web应用程序获取JSON

  12. 12

    将列表框的选定值传递给google-apps-script中的另一个列表框

  13. 13

    如何使用 App Script 将电子邮件或帖子从 Google 群组移动到另一个 Google 群组?

  14. 14

    如何将一个Web api控制器方法调用到另一个Web api项目中?

  15. 15

    ASP.NET Web窗体和身份:将IdentityModels.cs移至另一个项目

  16. 16

    尝试从另一个窗口追加ChildHTML对象时,Internet Explorer抛出SCRIPT5022:HierarchyRequestError

  17. 17

    如何通过Python Script Mac在另一个应用程序中打开文档(例如.txt)

  18. 18

    如何在PHP Script中插入已将前例键引用到另一个表的主键的记录?

  19. 19

    如何从C#中的另一个项目调用或启动asp.net Web服务(asmx)

  20. 20

    在另一个虚拟目录中运行一个项目进行调试

  21. 21

    如何使用不同的阶段/不同的GSuite帐户开发Google Apps Script Web App?

  22. 22

    如何使用 .net core 对来自 Ionic 的移动设备和另一个来自 Web 的移动设备进行身份验证?

  23. 23

    使用Google Script检查一个日期是否大于另一个日期

  24. 24

    如何在另一个电子表格中使用Google Apps脚本?

  25. 25

    Google Apps Marketplace v2-如何使用“测试安装”以另一个测试域测试在GAMv2中创建的项目?

  26. 26

    Google Apps脚本-如何将列复制到下一个可用列的另一个工作表

  27. 27

    在另一个模板中下划线模板<script type =“ text / template> </ script>

  28. 28

    在PHP文件中将cURL与Google Apps Script Web App一起使用时出现问题

  29. 29

    如何通过域将参数传递到 Apps Script Web 应用程序?

热门标签

归档