Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome extension 来自外部应用程序的调用绑定脚本-Google电子表格_Google Chrome Extension_Google Apps Script_Google Sheets_Xmlhttprequest_Urlfetch - Fatal编程技术网

Google chrome extension 来自外部应用程序的调用绑定脚本-Google电子表格

Google chrome extension 来自外部应用程序的调用绑定脚本-Google电子表格,google-chrome-extension,google-apps-script,google-sheets,xmlhttprequest,urlfetch,Google Chrome Extension,Google Apps Script,Google Sheets,Xmlhttprequest,Urlfetch,我想将Chrome扩展与Google电子表格集成 简单地说:我希望我的Chrome扩展打开一个电子表格,并调用电子表格中包含的一个脚本。特别是JSON数据(见最后的更新) 我在处理扩展方面的知识还不错 此外,我还了解如何在电子表格中创建绑定脚本 但是,我对谷歌网络应用、doGets和类似的东西的了解非常混乱,他们的文档从一个我应该知道他们在说什么的点开始,但我不知道。所以我需要关于事物如何流动的细节。在不知道代码应该是什么和在哪里的情况下谈论身份验证之类的事情似乎没有任何意义 所以我需要一个

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

简单地说:我希望我的Chrome扩展打开一个电子表格,并调用电子表格中包含的一个脚本。特别是JSON数据(见最后的更新)

  • 我在处理扩展方面的知识还不错
  • 此外,我还了解如何在电子表格中创建绑定脚本
  • 但是,我对谷歌网络应用、doGets和类似的东西的了解非常混乱,他们的文档从一个我应该知道他们在说什么的点开始,但我不知道。所以我需要关于事物如何流动的细节。在不知道代码应该是什么和在哪里的情况下谈论身份验证之类的事情似乎没有任何意义
所以我需要一个详细的答案。而中的部分是绝对必要的

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

工作表需要获取一些外部数据(我不控制这些数据)才能使用这些数据运行脚本。如果我使用
UrlFetch
从电子表格中尝试,我会遇到跨域问题,Google会阻止我(如果你能帮助我绕过这个跨域问题,那也太好了)

在Chrome扩展中,附加到检索数据的页面,我可以执行所有需要的请求并实际获取数据,但是,我不知道如何将这些数据发送到工作表。

因此,我希望分机和工作表能够相互通信。这不需要是双向的谈话。如果扩展插件可以在工作表中输入数据而不得到答案,那么它就工作了

这是可以实现的吗

还有别的办法吗


更新:

在@Peter Herrmann的帮助下,我成功地摆脱了困境
doGet
doPost
已设置(如本问题末尾所示),现在我正努力将“JSON”数据发送到工作表。我在单独的表中创建了“JSON”和“JSONP”版本进行测试

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

如果我使用浏览器控制台发送
XMLHttpRequest
,它会带来以下错误,即脚本的“JSON”或“JSONP”版本:

  • Chrome的控制台:“无法加载XMLHttpRequest。对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许源站”标头。因此不允许源站访问。响应的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"}));
但是,在这样的脚本标记中使用标准的“JSONP”请求是可行的(但这不会将JSON发送到工作表,是吗?):


是的,当然有可能。但你的问题就目前而言,太开放了。你需要把它分解成2到3个不同的问题,并附上你已经编写和试用过的代码。然后有人可以帮你,而不是他们自己完成整个写作


与脚本通信的最简单方法是使用doGet()或doPost()。这可能有点让人困惑,试着多读一读,然后做谷歌文档中的例子。一旦你掌握了窍门,就很容易了。URLFetch是为向任意URL发出请求而设计的,因此跨域不应因此而出现。同样,除非您自己编写一些代码,否则请尝试一下,然后发布到这里,这很难帮助您。

是的,当然有可能。但你的问题就目前而言,太开放了。你需要把它分解成2到3个不同的问题,并附上你已经编写和试用过的代码。然后有人可以帮你,而不是他们自己完成整个写作


与脚本通信的最简单方法是使用doGet()或doPost()。这可能有点让人困惑,试着多读一读,然后做谷歌文档中的例子。一旦你掌握了窍门,就很容易了。URLFetch是为向任意URL发出请求而设计的,因此跨域不应因此而出现。同样,除非您自己编写一些代码,否则请尝试一下,然后将其发布到此处,这很难提供帮助。

您说您想从chrome扩展更新电子表格。您可以在脚本中使用公开更新函数,然后从扩展名调用该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);
}
要测试:

  • 在代码编辑器中,发布>部署为Web应用
  • 选择“以我的身份执行应用程序”,允许访问:任何人,甚至匿名
  • 单击部署,然后单击授权和允许
  • 复制并记录给定的URL。我得到了
    https://script.google.com/macros/s/akfycbyty0nozdtm5j_tznuxw9skwbylladvkdddcd593xc-H6LN4A/exec
  • 向URL添加
    ?somedata=ABC123
    ,并从匿名浏览器窗口点击完整URL 这导致在单元格B1中设置“ABC123”,浏览器消息:{“数据”:“谢谢,我收到了:ABC123”,“错误:null}


    这里有一个指向的链接,您可以从中归档>制作副本。

    您说您想从chrome扩展名更新电子表格。您可以在脚本中使用公开更新函数,然后从扩展名调用该URL。下面是一个在电子表格单元格和r中设置数据的示例
    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);
    }
    
    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);
    }
    
    function doGet() {
      return ContentService.createTextOutput('Hello, world!');
    }
    
    function doGet(request) {
    
     var employees = {"employees": [  { "firstName": "John", "lastName": "Doe"}, { "firstName": "Anna", "lastName": "Smith"} ] }
    
      return ContentService.createTextOutput(JSON.stringify(employees))
        .setMimeType(ContentService.MimeType.JSON);
    }
    
    function doGet(e) 
    {
      Logger.log( Utilities.jsonStringify(e) );
    
      if (e.parameter.data) 
      {
        var dataInQueryString = e.parameter['data']
    
        // now we can write dataInQueryString to a spreadhseet using spreadhsheet api
    
        return ContentService.createTextOutput('Content received : '+ dataInQueryString);
    
      }
    }