Google apps script GoogleSheets脚本作为脚本工作,但不是web应用程序?

Google apps script GoogleSheets脚本作为脚本工作,但不是web应用程序?,google-apps-script,google-sheets,google-speech-api,Google Apps Script,Google Sheets,Google Speech Api,抱歉,如果我错过了一些非常明显的东西,谷歌脚本不是我的强项 我希望能够在一个单元格中找到数据,并从另一个站点覆盖它。我试图修改: 该函数作为脚本运行良好,但只要我将其添加到doGet中,就不会发生任何事情,即使我收到一条消息说脚本已完成。我错过了什么\ 编辑:它似乎是工作形式的测试web应用程序为您的最新代码选项;但即使我创建了一个新版本,它仍然无法从链接中工作 EDIT2:所以,虽然我不是100%确定问题出在哪里,但这似乎与登录多个Google帐户以及设置谁有权访问此应用程序有关。或者可能是缓

抱歉,如果我错过了一些非常明显的东西,谷歌脚本不是我的强项

我希望能够在一个单元格中找到数据,并从另一个站点覆盖它。我试图修改:

该函数作为脚本运行良好,但只要我将其添加到doGet中,就不会发生任何事情,即使我收到一条消息说脚本已完成。我错过了什么\

编辑:它似乎是工作形式的测试web应用程序为您的最新代码选项;但即使我创建了一个新版本,它仍然无法从链接中工作


EDIT2:所以,虽然我不是100%确定问题出在哪里,但这似乎与登录多个Google帐户以及设置谁有权访问此应用程序有关。或者可能是缓存了脚本的旧版本。不管怎样,它现在都在工作 如果您的web应用程序在开发模式下工作,请针对最新代码测试web应用程序,但在部署时不工作,那么问题在于如何部署它

编辑脚本不会更改Web应用功能中的任何内容,除非使用发布->部署为Web应用部署新版本,创建Web应用的新版本,然后单击部署


如果您的web应用程序在开发模式下工作,请针对最新代码测试web应用程序,但在部署时不工作,那么问题在于如何部署它

编辑脚本不会更改Web应用功能中的任何内容,除非使用发布->部署为Web应用部署新版本,创建Web应用的新版本,然后单击部署


这是一个将可编辑电子表格放在HTML页面上的web应用程序的简单示例。发布为webapp。您必须在下面代码的前两行中提供电子表格ID和表格名称

代码G.gs:

var SSID='SpreadsheetID';
var sheetName='Sheet Name';
function htmlSpreadsheet(mode)
{
  var mode=(typeof(mode)!='undefined')?mode:'dialog';
  var br='<br />';
  var s='';
  var hdrRows=1;
  var ss=SpreadsheetApp.openById(SSID);
  var sht=ss.getSheetByName(sheetName);
  var rng=sht.getDataRange();
  var rngA=rng.getValues();
  s+='<table>';
  for(var i=0;i<rngA.length;i++)
  {
    s+='<tr>';
    for(var j=0;j<rngA[i].length;j++)
    {
      if(i<hdrRows)
      {
        s+='<th id="cell' + i + j + '">' + '<input id="txt' + i + j + '" type="text" value="' + rngA[i][j] + '" size="10" onChange="updateSS(' + i + ',' + j + ');" />' + '</th>';
      } 
      else
      {
        s+='<td id="cell' + i + j + '">' + '<input id="txt' + i + j + '" type="text" value="' + rngA[i][j] + '" size="10" onChange="updateSS(' + i + ',' + j + ');" />' + '</th>';
      }
    }
    s+='</tr>';
  }
  s+='</table>';
  //s+='<div id="success"></div>';
  s+='</body></html>';
  switch (mode)
  {
    case 'dialog':
      var userInterface=HtmlService.createHtmlOutputFromFile('htmlss').setWidth(1000).setHeight(450);
      userInterface.append(s);
      SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Spreadsheet Data for ' + ss.getName() + ' Sheet: ' + sht.getName());
      break;
    case 'web':
      var userInterface=HtmlService.createHtmlOutputFromFile('htmlss').setWidth(1000).setHeight(450);
      return userInterface.append(s).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
   }
}

function updateSpreadsheet(i,j,value)
{
  var ss=SpreadsheetApp.openById(SSID);
  var sht=ss.getSheetByName(sheetName);
  var rng=sht.getDataRange();
  var rngA=rng.getValues();
  rngA[i][j]=value;
  rng.setValues(rngA);
  var data = {'message':'Cell[' + Number(i + 1) + '][' + Number(j + 1) + '] Has been updated', 'ridx': i, 'cidx': j};
  return data;
}

function doGet()
{
  var output=htmlSpreadsheet('web');
  return output;
}
htmlss.html:

<!DOCTYPE html>
<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
    $(function() {

    });
    function updateSS(i,j)
    {
      var str='#txt' + String(i) + String(j);
      var value=$(str).val();
      $(str).css('background-color','#ffff00');
      google.script.run
         .withSuccessHandler(successHandler)
         .updateSpreadsheet(i,j,value)
    }
    function successHandler(data)
    {
      $('#success').text(data.message);
      $('#txt' + data.ridx + data.cidx).css('background-color','#ffffff');
    }
    console.log('My Code');
    </script>
    <style>
      th{text-align:left}
    </style>
  </head>
  <body>
  <div id="success"></div>

这是一个将可编辑电子表格放在HTML页面上的web应用程序的简单示例。发布为webapp。您必须在下面代码的前两行中提供电子表格ID和表格名称

代码G.gs:

var SSID='SpreadsheetID';
var sheetName='Sheet Name';
function htmlSpreadsheet(mode)
{
  var mode=(typeof(mode)!='undefined')?mode:'dialog';
  var br='<br />';
  var s='';
  var hdrRows=1;
  var ss=SpreadsheetApp.openById(SSID);
  var sht=ss.getSheetByName(sheetName);
  var rng=sht.getDataRange();
  var rngA=rng.getValues();
  s+='<table>';
  for(var i=0;i<rngA.length;i++)
  {
    s+='<tr>';
    for(var j=0;j<rngA[i].length;j++)
    {
      if(i<hdrRows)
      {
        s+='<th id="cell' + i + j + '">' + '<input id="txt' + i + j + '" type="text" value="' + rngA[i][j] + '" size="10" onChange="updateSS(' + i + ',' + j + ');" />' + '</th>';
      } 
      else
      {
        s+='<td id="cell' + i + j + '">' + '<input id="txt' + i + j + '" type="text" value="' + rngA[i][j] + '" size="10" onChange="updateSS(' + i + ',' + j + ');" />' + '</th>';
      }
    }
    s+='</tr>';
  }
  s+='</table>';
  //s+='<div id="success"></div>';
  s+='</body></html>';
  switch (mode)
  {
    case 'dialog':
      var userInterface=HtmlService.createHtmlOutputFromFile('htmlss').setWidth(1000).setHeight(450);
      userInterface.append(s);
      SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Spreadsheet Data for ' + ss.getName() + ' Sheet: ' + sht.getName());
      break;
    case 'web':
      var userInterface=HtmlService.createHtmlOutputFromFile('htmlss').setWidth(1000).setHeight(450);
      return userInterface.append(s).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
   }
}

function updateSpreadsheet(i,j,value)
{
  var ss=SpreadsheetApp.openById(SSID);
  var sht=ss.getSheetByName(sheetName);
  var rng=sht.getDataRange();
  var rngA=rng.getValues();
  rngA[i][j]=value;
  rng.setValues(rngA);
  var data = {'message':'Cell[' + Number(i + 1) + '][' + Number(j + 1) + '] Has been updated', 'ridx': i, 'cidx': j};
  return data;
}

function doGet()
{
  var output=htmlSpreadsheet('web');
  return output;
}
htmlss.html:

<!DOCTYPE html>
<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
    $(function() {

    });
    function updateSS(i,j)
    {
      var str='#txt' + String(i) + String(j);
      var value=$(str).val();
      $(str).css('background-color','#ffff00');
      google.script.run
         .withSuccessHandler(successHandler)
         .updateSpreadsheet(i,j,value)
    }
    function successHandler(data)
    {
      $('#success').text(data.message);
      $('#txt' + data.ridx + data.cidx).css('background-color','#ffffff');
    }
    console.log('My Code');
    </script>
    <style>
      th{text-align:left}
    </style>
  </head>
  <body>
  <div id="success"></div>

这里发生了一些奇怪的事情,根据您显示部署过程的视频,您的部署似乎是正确的。遵循这些步骤后的预期行为表明,已发布的脚本链接将与dev链接完全相同。我不认为这个问题是你做错了什么,而是一个奇怪的谷歌问题

解决方案是创建脚本的新副本并发布,然后在新的URL上尝试


在其他场景中,我在应用程序脚本中也看到过类似的问题,脚本的前一个副本似乎被缓存在某个地方,执行时的行为与脚本编辑器中显示的行为不匹配。

这里发生了一些奇怪的事情,根据显示部署过程的视频,您的部署似乎是正确的。遵循这些步骤后的预期行为表明,已发布的脚本链接将与dev链接完全相同。我不认为这个问题是你做错了什么,而是一个奇怪的谷歌问题

解决方案是创建脚本的新副本并发布,然后在新的URL上尝试


在其他场景中,我在应用程序脚本中也看到过类似的问题,在这些场景中,脚本的前一个副本似乎被缓存在某个地方,执行时的行为与脚本编辑器中显示的行为不匹配。

因此,尽管我不能100%确定问题是什么,这似乎与登录多个谷歌账户以及设置谁可以访问该应用程序有关。或者可能是缓存了脚本的旧版本。不管怎样,它现在都在工作 因此,尽管我不能100%确定问题出在哪里,但这似乎与登录多个谷歌账户以及设置谁有权访问此应用程序有关。或者可能是缓存了脚本的旧版本。不管怎样,它现在都在工作。我相信您不会希望将其作为Web应用程序运行。您希望什么触发代码以使其运行?我认为使用术语Web App是不正确的,因为您缺少每个的要求,其中规定必须返回HTML服务HtmlOutput对象或内容服务TextOutput对象。然后,您可以使用上面链接页面上的说明将代码发布为Web应用程序。我刚刚尝试添加return HtmlService.createHtmlOutputFromFile'success.html';,success.html是一个非常简单的html文档,显示文本success。脚本完成后,我仍然收到相同的消息,但没有返回任何消息:\你是如何启动脚本的?你从哪里得到这个消息的?我可以从你的帖子中获取你的代码,当然可以更改文件ID,并从测试链接和部署链接运行它。在这两种情况下,我都会收到相同的消息,脚本已完成,但没有返回任何内容。在这两种情况下,在F fo列中都是
r列A包含所有小写字母的xyz的任何行。我直接复制了代码,只更改了文件ID。部署时,我将“执行应用”设置为“我”和“谁只能访问我自己”。之前设置为什么?您是否拥有多个Google帐户,并且在浏览器中登录了多个帐户?它可能试图以另一个无法访问该文件的帐户运行?如果您有多个应用程序,请尝试注销其他应用程序并限制权限,因为您不希望将其作为Web应用程序运行。您希望什么触发代码以使其运行?我认为使用术语Web App是不正确的,因为您缺少每个的要求,其中规定必须返回HTML服务HtmlOutput对象或内容服务TextOutput对象。然后,您可以使用上面链接页面上的说明将代码发布为Web应用程序。我刚刚尝试添加return HtmlService.createHtmlOutputFromFile'success.html';,success.html是一个非常简单的html文档,显示文本success。脚本完成后,我仍然收到相同的消息,但没有返回任何消息:\你是如何启动脚本的?你从哪里得到这个消息的?我可以从你的帖子中获取你的代码,当然可以更改文件ID,并从测试链接和部署链接运行它。在这两种情况下,我都会收到相同的消息,脚本已完成,但没有返回任何内容。在这两种情况下,对于A列包含xyz的所有小写字母的任何行,F列中都会显示“是”。我直接复制了代码,只更改了文件ID。部署时,我将“执行应用”设置为“我”和“谁只能访问我自己”。之前设置为什么?您是否拥有多个Google帐户,并且在浏览器中登录了多个帐户?它可能试图以另一个无法访问该文件的帐户运行?如果您有多个响应,请尝试注销其他响应,并限制对响应的权限。你能看看并告诉我哪里出了问题吗?我想我正是按照你的步骤做的。谢谢你的回复。你能看看并告诉我哪里出了问题吗?我想我正是按照你的步骤来做的。我会在上面添加一个编辑,但我想也许我找到了答案。我将有权访问该应用程序的用户设置为任何人,甚至是匿名用户。现在,当我在浏览器中输入URL时,我会收到成功消息。如果我仍然缺少一些东西,或者它应该以另一种方式工作,请一定要让我知道,因为我在这方面非常缺乏经验。这可能已经解决了我间接提到的问题,当你将其更改为任何人时,即使是匿名URL也会更改。它应该不需要设置为任何人,甚至匿名才能正常工作。我会在上面添加一个编辑,但我想也许我已经找到了答案。我将有权访问该应用程序的用户设置为任何人,甚至是匿名用户。现在,当我在浏览器中输入URL时,我会收到成功消息。如果我仍然缺少一些东西,或者它应该以另一种方式工作,请一定要让我知道,因为我在这方面非常缺乏经验。这可能已经解决了我间接提到的问题,当你将其更改为任何人时,即使是匿名URL也会更改。它不需要设置为任何人,即使是匿名的,也可以正常工作。