从外部应用程序调用绑定脚本 - Google电子表格

Dan*_*ler 1 xmlhttprequest google-sheets urlfetch google-chrome-extension google-apps-script

我想将Chrome扩展程序与Google电子表格集成.

简单来说:我希望我的Chrome扩展程序能够打开电子表格并调用电子表格中包含的其中一个脚本.特别是JSON数据(参见最后的更新).

  • 我处理扩展的知识很好.
  • 另外,我在电子表格中创建绑定脚本的知识.
  • 但是,我对谷歌网络应用程序,doGets和类似的东西的知识非常困惑,他们的文档从我应该知道他们在谈论什么的点开始,但我没有.所以我需要有关事情如何流动的细节.在不知道代码应该是什么以及在哪里的情况下谈论身份验证和内容似乎并没有带来任何影响.

所以我需要一个详细的答案.而其中的部分是绝对必要的.

到目前为止,我有一个非常好的脚本运行(脚本不是这个问题的范围),绑定到电子表格.(该脚本应仅针对此工作表运行,因此除非出于技术原因,否则保持绑定不是问题).

工作表需要获取一些外部数据(我无法控制)来运行带有该数据的脚本.如果我使用电子表格进行尝试UrlFetch,我会遇到跨域问题而谷歌阻止我(如果你可以帮助我绕过这个跨域问题,它也会很棒).

在Chrome扩展程序中,附加到检索数据的页面,我可以执行所需的所有请求并实际获取数据,但之后,我不知道如何将此数据发送到工作表.

所以,我希望扩展和工作表能够相互通信.它不需要是双向谈话.如果只是扩展程序可以在工作表中输入数据而没有得到答案,则它可以工作.

这可以实现吗?

还有另一种方法吗?


更新:

在@Peter Herrmann的帮助下,我能够摆脱零.doGetdoPost设置(如此问题的结尾所示),现在我正在努力将"JSON"数据发送到工作表.我在单独的表中创建了"JSON"和"JSONP"版本以进行测试.

如果我exec在浏览器的导航栏中输入链接,它工作正常(但我相信这只是一个"GET",是吗?我可以通过导航栏发送JSON吗?).

如果我使用浏览器的控制台发送XMLHttpRequest它会带来以下错误,无论是脚本的"JSON"还是"JSONP"版本:

  • Chrome控制台:"XMLHttpRequest无法加载https://script.google.com/macros/s/xxxx/exec.对预检请求的响应未通过访问控制检查:否存在'Access-Control-Allow-Origin'标头因此,请求资源.原因https://xxxxxxxxx.com不允许访问.响应的HTTP状态代码为405."
  • Mozilla的控制台---"405方法不允许".

用于请求的代码是:

var req = new XMLHttpRequest();     
req.open("POST", "https://script.google.com/macros/.../exec", true);
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.send(JSON.stringify({d1:"hey", d2:"there"}));
Run Code Online (Sandbox Code Playgroud)

但是,在像这样的脚本标记中使用标准的"JSONP"请求是有效的(但是这不会将JSON发送到工作表,是吗?):

 $("<script src='https://script.google.com/macros/s/AKfycbza11ABUxtxn-rcv-1v2ZM3uCzpARx1-t6KkPJk4rtAta_4SQc/exec?prefix=window.alert'></script>").appendTo($(document.head)).remove();
Run Code Online (Sandbox Code Playgroud)

如果我尝试将请求代码放在脚本标记内,它也会导致"不允许"错误.

在表格代码中,相关部分是:

function doGet(request) {

   var result = JSON.stringify({data: 'Thanks, I received the request'});

   //JSON
   return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);

   //JSONP
   result = request.parameters.prefix + "(" + result + ");";
   return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JAVASCRIPT);
}


function doPost(request) {

   var result = JSON.stringify({data: 'Thanks, I received the request'});

   //JSON 
   return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JSON);

   //JSONP
   result = request.parameters.prefix + "(" + result + ");";
   return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.JAVASCRIPT);
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ann 5

您说要从Chrome扩展程序更新电子表格.您可以在脚本中使用ContentService公开更新功能,然后从您的扩展中调用该URL.这是一个在电子表格单元格中设置数据并返回消息的示例:

function doGet(request) {

  //get the data from the request's "somedata" querystring parameter ..../exec?somedata=mydata
  var data = request.parameters.somedata;

  //update the bound spreadsheet (workaround https://code.google.com/p/google-apps-script-issues/issues/detail?id=5734)
  SpreadsheetApp.openById('1cm6tK0Io4lnbRZ0OhlvZijhrQoqCt01adyYlUbZgUZY')
  .getSheetByName('Sheet1')
  .getRange('B1')
  .setValue(data);

  //send some data back as a response
  var result = {
    data: 'Thanks, I received: ' + data,
    error: null
  };
  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}
Run Code Online (Sandbox Code Playgroud)

去测试:

  1. 在代码编辑器中,发布>部署为Web App
  2. 选择以我身份执行应用程序,允许访问:任​​何人,甚至匿名
  3. 单击"部署",然后单击"授权和允许".
  4. 复制并记下给定的URL.我有https: //script.google.com/macros/s/AKfycbyTi0NOZdTm5J_tZnUXw9skWfYlLADvkDDdCd593XC-H6LN4A/exec
  5. 添加?somedata=ABC123到网址并点击隐身浏览器窗口中的完整网址.https://script.google.com/macros/s/AKfycbyTi0NOZdTm5J_tZnUXw9skWfYlLADvkDDdCd593XC-H6LN4A/exec?somedata=ABC123

这导致在单元格B1和浏览器消息中设置"ABC123":{"data":"谢谢,我收到:ABC123","错误":null}

这是源电子表格的链接,您可以从中进行文件>制作副本.