Google sheets 脚本作为脚本工作,而不是网络应用程序?
Google sheets script works as a script, but not a web app?
抱歉,如果我在这里遗漏了一些非常明显的东西,Google 脚本不是我的强项。
我希望能够在单元格中找到数据并从另一个站点覆盖它。我试图修改 this answer:
function test(){
var sh = SpreadsheetApp.getActiveSheet();
var data = sh.getDataRange().getValues(); // read all data in the sheet
for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A
if(data[n][0].toString().match('xyz')=='xyz'){ data[n][5] = 'YES'};// if column A contains 'xyz' then set value in index [5] (is column F)
}
Logger.log(data)
sh.getRange(1,1,data.length,data[0].length).setValues(data); // write back to the sheet
}
来自
1) 将 SpreadsheetApp.getActiveSheet();
更改为 SpreadsheetApp.openById("1ZHFGKtY7AaAtdMN8D5V9f2WTf8t9ldOW2pZ5my1CKnE").getSheetByName("Sheet1");
,以及 2) 将其包装在 doGet()
函数中,因此它看起来像这样:
function doGet(e) {
var sh = SpreadsheetApp.openById("1ZHFGKtY7AaAtdMN8D5V9f2WTf8t9ldOW2pZ5my1CKnE").getSheetByName("Sheet1");
var data = sh.getDataRange().getValues(); // read all data in the sheet
for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A
if(data[n][0].toString().match('xyz')=='xyz'){
data[n][5] = 'YES'
}; // if column A contains 'xyz' then set value in index [5] (is column F)
sh.getRange(1,1,data.length,data[0].length).setValues(data); // write back to the sheet
}
}
该函数作为脚本运行良好,但是当我将它添加到 doGet() 时没有任何反应,即使我收到一条消息说脚本已完成。我错过了什么? :\
编辑:它似乎在 "Test web app for your latest code" 选项中起作用;但即使我创建了一个新版本,它仍然无法在 link 中运行。
EDIT2:所以虽然我不是 100% 确定问题出在哪里,但它似乎与登录多个 Google 帐户和设置 "Who has access to this app" 有关。或者可能是旧版本的脚本缓存在某处。无论哪种方式,它现在都在工作。
如果您的 Web 应用程序在开发模式 ("Test web app for your latest code") 下工作,但在部署时不工作,则问题在于它的部署方式。
编辑脚本不会改变 Web 应用程序的任何功能,直到使用发布 -> 部署为 Web 应用程序部署新版本,创建 new 版本的 Web 应用程序,并且点击 "Deploy".
这是将可编辑电子表格放在 HTML 页面上的网络应用程序的简单示例。发布为网络应用程序。您必须在以下代码的前两行中提供他的 SpreadsheetID 和 Sheet 名称。
Code.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>
这里发生了一些奇怪的事情,根据您显示部署过程的视频,您似乎部署正确。执行这些步骤后的预期行为是发布的脚本 link 将与开发 link 完全一样。我不认为这个问题是你做错了什么,而是一个奇怪的 Google 问题。
解决方案是创建脚本的新副本并发布,然后在新 URL 上尝试。
我在其他场景的 Apps 脚本中看到了类似的问题,似乎脚本的先前副本缓存在某处,并且执行时的行为与脚本编辑器中显示的不匹配。
所以虽然我不是 100% 确定问题出在哪里,但它似乎与登录多个 Google 帐户和设置 "Who has access to this app" 有关。或者可能是旧版本的脚本缓存在某处。无论哪种方式,它现在都在工作。
抱歉,如果我在这里遗漏了一些非常明显的东西,Google 脚本不是我的强项。
我希望能够在单元格中找到数据并从另一个站点覆盖它。我试图修改 this answer:
function test(){
var sh = SpreadsheetApp.getActiveSheet();
var data = sh.getDataRange().getValues(); // read all data in the sheet
for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A
if(data[n][0].toString().match('xyz')=='xyz'){ data[n][5] = 'YES'};// if column A contains 'xyz' then set value in index [5] (is column F)
}
Logger.log(data)
sh.getRange(1,1,data.length,data[0].length).setValues(data); // write back to the sheet
}
来自
1) 将 SpreadsheetApp.getActiveSheet();
更改为 SpreadsheetApp.openById("1ZHFGKtY7AaAtdMN8D5V9f2WTf8t9ldOW2pZ5my1CKnE").getSheetByName("Sheet1");
,以及 2) 将其包装在 doGet()
函数中,因此它看起来像这样:
function doGet(e) {
var sh = SpreadsheetApp.openById("1ZHFGKtY7AaAtdMN8D5V9f2WTf8t9ldOW2pZ5my1CKnE").getSheetByName("Sheet1");
var data = sh.getDataRange().getValues(); // read all data in the sheet
for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A
if(data[n][0].toString().match('xyz')=='xyz'){
data[n][5] = 'YES'
}; // if column A contains 'xyz' then set value in index [5] (is column F)
sh.getRange(1,1,data.length,data[0].length).setValues(data); // write back to the sheet
}
}
该函数作为脚本运行良好,但是当我将它添加到 doGet() 时没有任何反应,即使我收到一条消息说脚本已完成。我错过了什么? :\
编辑:它似乎在 "Test web app for your latest code" 选项中起作用;但即使我创建了一个新版本,它仍然无法在 link 中运行。
EDIT2:所以虽然我不是 100% 确定问题出在哪里,但它似乎与登录多个 Google 帐户和设置 "Who has access to this app" 有关。或者可能是旧版本的脚本缓存在某处。无论哪种方式,它现在都在工作。
如果您的 Web 应用程序在开发模式 ("Test web app for your latest code") 下工作,但在部署时不工作,则问题在于它的部署方式。
编辑脚本不会改变 Web 应用程序的任何功能,直到使用发布 -> 部署为 Web 应用程序部署新版本,创建 new 版本的 Web 应用程序,并且点击 "Deploy".
这是将可编辑电子表格放在 HTML 页面上的网络应用程序的简单示例。发布为网络应用程序。您必须在以下代码的前两行中提供他的 SpreadsheetID 和 Sheet 名称。
Code.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>
这里发生了一些奇怪的事情,根据您显示部署过程的视频,您似乎部署正确。执行这些步骤后的预期行为是发布的脚本 link 将与开发 link 完全一样。我不认为这个问题是你做错了什么,而是一个奇怪的 Google 问题。
解决方案是创建脚本的新副本并发布,然后在新 URL 上尝试。
我在其他场景的 Apps 脚本中看到了类似的问题,似乎脚本的先前副本缓存在某处,并且执行时的行为与脚本编辑器中显示的不匹配。
所以虽然我不是 100% 确定问题出在哪里,但它似乎与登录多个 Google 帐户和设置 "Who has access to this app" 有关。或者可能是旧版本的脚本缓存在某处。无论哪种方式,它现在都在工作。