- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从昨天开始,我们在将 REST API (urlfetch) 制作到 Zendesk 中时开始在 Google 电子表格中遇到错误。我们已经使用了 1.5 年,并没有遇到任何问题。它给出的错误是通用的——“遇到错误:很抱歉,发生服务器错误。请稍等一下,然后重试。”错误的屏幕截图 - http://support.prontomarketing.com/attachments/token/j1bjrnw1cpfu4tu/?name=2012-06-27_08-56-19.jpg
Google Apps Script Spreadsheet Services API 最近有什么变化吗?
有没有人有什么想法?
这是我们的脚本:(注意* zendesk 的 url 和 token 已被删除)
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [ {name: "Create Tickets", functionName: "oneToMany"},{name: "Reset Form", functionName: "resetForm"} ];
ss.addMenu("Actions", menuEntries);
}
function resetForm(){
var doc = SpreadsheetApp.getActiveSpreadsheet();
var currentIndex = doc.getActiveSelection().getRowIndex();
var totalRow = findThelastRow('a',0);
for (var count=2;count<totalRow;count++)
{
doc.getSheets()[0].getRange('a'+count).clear({contentsOnly:true});
doc.getSheets()[0].getRange('h'+count).clear({contentsOnly:true});
doc.getSheets()[0].getRange('h'+count).setBackgroundColor('#ffffff');
doc.getSheets()[0].getRange('i'+count).clear({contentsOnly:true});
doc.getSheets()[0].getRange('i'+count).setBackgroundColor('#ffffff');
//doc.getSheets()[0].getRange('c'+count).setValue(clearA(doc.getSheets()[0].getRange('c'+count).getValue()));
}
}
function continueRest(){
var doc = SpreadsheetApp.getActiveSpreadsheet();
var app = UiApp.createApplication().setTitle('Please Input Your Zendesk Username');
app.setHeight('75');
app.setWidth('400');
// Create a grid with 3 text boxes and corresponding labels
var grid = app.createGrid(1, 2);
// Text entered in the text box is passed in to userName
grid.setWidget(0, 0, app.createLabel('Username:'));
var inputTextBox1 = app.createTextBox().setName('username');
inputTextBox1.setWidth('300px');
grid.setWidget(0, 1,inputTextBox1 );
// Create a vertical panel..
var panel = app.createVerticalPanel();
// ...and add the grid to the panel
panel.add(grid);
// Create a button and click handler; pass in the grid object as a callback element and the handler as a click handler
// Identify the function b as the server click handler
var button = app.createButton('submit').setId('button');
var handler = app.createServerClickHandler('continueSentTheRest');
handler.addCallbackElement(grid);
button.addClickHandler(app.createServerClickHandler('pauseUI'));
button.addClickHandler(handler);
//button.setStyleAttribute('display', 'none');
// Add the button to the panel and the panel to the application, then display the application app in the Spreadsheet doc
panel.add(button);
app.add(panel);
doc.show(app);
}
function oneToMany(){
var doc = SpreadsheetApp.getActiveSpreadsheet();
var app = UiApp.createApplication().setTitle('Please Input Your Zendesk Username');
app.setHeight('75');
app.setWidth('400');
// Create a grid with 3 text boxes and corresponding labels
var grid = app.createGrid(1, 2);
// Text entered in the text box is passed in to userName
grid.setWidget(0, 0, app.createLabel('Username:'));
var inputTextBox1 = app.createTextBox().setName('username');
inputTextBox1.setWidth('300px');
grid.setWidget(0, 1,inputTextBox1 );
// Create a vertical panel..
var panel = app.createVerticalPanel();
// ...and add the grid to the panel
panel.add(grid);
// Create a button and click handler; pass in the grid object as a callback element and the handler as a click handler
// Identify the function b as the server click handler
var button = app.createButton('submit').setId('button');
var handler = app.createServerClickHandler('authHandler');
handler.addCallbackElement(grid);
button.addClickHandler(app.createServerClickHandler('pauseUI'));
button.addClickHandler(app.createServerClickHandler('mapValue'));
button.addClickHandler(handler);
//button.setStyleAttribute('display', 'none');
// Add the button to the panel and the panel to the application, then display the application app in the Spreadsheet doc
panel.add(button);
app.add(panel);
doc.show(app);
}
function pauseUI(e) {
var app = UiApp.getActiveApplication();
// try 'pausing' the app while we process the info
app.setTitle('Please wait...');
app.getElementById("button").setEnabled(false);
return app;
}
var table = SpreadsheetApp.getActive().getSheets()[1].getDataRange().getValues();
function selectByIndex( index ) {
Logger.log(table);
for( var i in table )
if( table[i][0] == index )
return table[i];
return null; //or throw exception
}
function mapValue(){
//Get the key value sheet.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1];
Logger.log('on the loop');
if (sheet != null) {
for (var i in table){
var groupKey =table[i][0];
var groupValue = table[i][1];
//Logger.log(groupKey+' '+groupValue);
if(groupKey!=''&&groupValue!='')
ScriptProperties.setProperty(groupKey,groupValue.toString());
var assigneeKey = table[i][2];
var assigneeValue = table[i][3];
if(assigneeKey!=''&&assigneeValue!='')
ScriptProperties.setProperty(assigneeKey,assigneeValue.toString());
}
//Priority
ScriptProperties.setProperty('P: Low','1');
ScriptProperties.setProperty('P: Normal','2');
ScriptProperties.setProperty('P: High','3');
ScriptProperties.setProperty('P: Urgent','4');
//Browser.msgBox(ScriptProperties.getProperty('Development'));
}
else
{
Browser.msgBox('There is no sheet contain id for the assignee and group.');
}
//Browser.msgBox(ScriptProperties.getProperty('P: Urgent'));
}
function createPayLoad(count){
var doc = SpreadsheetApp.getActiveSpreadsheet();
var requester = doc.getSheets()[0].getRange('a'+count).getValue();
var ticketTitle = doc.getSheets()[0].getRange('b'+count).getValue().toString().replace('&','&');
var ticketComment = doc.getSheets()[0].getRange('c'+count).getValue().toString().replace('&','&');
ticketComment = replaceBR(ticketComment);
ticketComment = replaceA(ticketComment);
var assignee = ScriptProperties.getProperty(doc.getSheets()[0].getRange('d'+count).getValue());
var group = ScriptProperties.getProperty(doc.getSheets()[0].getRange('e'+count).getValue());
Logger.log(doc.getSheets()[0].getRange('f'+count).getValue());
var priority = ScriptProperties.getProperty('P: '+doc.getSheets()[0].getRange('f'+count).getValue().trim());
var tags = 'internal '+doc.getSheets()[0].getRange('g'+count).getValue();
var payLoad = '\n';
payLoad += '<ticket>'+'\n';
payLoad += '<requester-email>'+requester+'</requester-email>'+'\n';
payLoad += '<subject>'+ticketTitle+'</subject>'+'\n';
payLoad += '<description>'+ticketComment+'</description>'+'\n';
payLoad += '<assignee-id>'+assignee+'</assignee-id>'+'\n';
payLoad += '<group-id>'+group+'</group-id>'+'\n';
payLoad += '<priority-id>'+priority+'</priority-id>'+'\n';
payLoad += '<set-tags>'+tags+'</set-tags>'+'\n';
payLoad += '</ticket>';
//Browser.msgBox(payLoad)
return payLoad;
}
function findThelastRow(column,index){
var doc = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = doc.getLastRow();
for(var i=2;i<=lastRow+1;i++)
{
if(doc.getSheets()[index].getRange(column+i).getValue()=="")
{
return i;
break;
}
}
return 0;
}
function authHandler(e){
if(e.parameter.username=="")
{
Browser.msgBox('Username is required!');
return;
}
var app = UiApp.getActiveApplication();
var doc = SpreadsheetApp.getActiveSpreadsheet();
var currentIndex = doc.getActiveSelection().getRowIndex();
var username = e.parameter.username;
var encode = Utilities.base64Encode(username+'/token:SECRET);
var totalRow = findThelastRow('a',0);
for (var count=2;count<totalRow;count++)
{
if(doc.getSheets()[0].getRange('a'+count).getValue()=='')
{
Browser.msgBox('Requester is required!');
return;
}
var isCreate = doc.getSheets()[0].getRange('i'+count).getValue();
var isNormalUpdate = false;
if(isCreate=='')
{
var payLoad = createPayLoad(count);
var options =
{
"method" : "post",
"headers" : {"Content-type":"application/xml","Authorization": "Basic "+encode},
"payload" : payLoad
};
var result = UrlFetchApp.fetch("http://SECRET/tickets.xml",options);
if(result.getResponseCode()==201) //This means success.
{
var mytool_array=result.getHeaders().toSource().split(",");
Logger.log(mytool_array);
//var ticketNumber=mytool_array[2].split("Location:");
var ticketNumber=result.getHeaders().toSource().split("Location:");
Logger.log(ticketNumber);
var valueTicket=ticketNumber[1].split('.xml')[0].split('tickets/')[1];
doc.getSheets()[0].getRange('h'+count).setValue('=hyperlink("http://SECRET/tickets/'+valueTicket+'";"'+valueTicket+'")');
doc.getSheets()[0].getRange('h'+count).setBackgroundColor('#1BE039');
doc.getSheets()[0].getRange('i'+count).setValue('OK');
doc.getSheets()[0].getRange('i'+count).setBackgroundColor('#1BE039');
}
else
{
doc.getSheets()[0].getRange('i'+count).setValue('FAIL');
break;
return;
}
}
}
// Clean up - get the UiApp object, close it, and return
app.close();
// The following line is REQUIRED for the widget to actually close.
return app;
}
function continueSentTheRest(e){
var app = UiApp.getActiveApplication();
var doc = SpreadsheetApp.getActiveSpreadsheet();
var indexOfA = findThelastRow('h',0);
if(doc.getSheets()[0].getRange('a'+indexOfA).getValue()=="")
{
Browser.msgBox('Requester is required!');
doc.getSheets()[0].setActiveSelection('a'+indexOfA);
return;
}
var username = e.parameter.username;
username += ':'+e.parameter.password;
var encode = Utilities.base64Encode(username);
var totalRow = findThelastRow('a',0);
for (var count=indexOfA;count<totalRow;count++)
{
var payLoad = createPayLoad(count);
var options =
{
"method" : "post",
"headers" : {"Content-type":"application/xml","Authorization": "Basic "+encode},
"payload" : payLoad
};
var result = UrlFetchApp.fetch("http://SECRET/tickets.xml",options);
if(result.getResponseCode()==201) //This means success.
{
var mytool_array=result.getHeaders().toSource().split(",");
var ticketNumber=mytool_array[2].split("Location:");
var valueTicket=ticketNumber[1].split('.xml')[0].split('tickets/')[1];
doc.getSheets()[0].getRange('h'+count).setValue('=hyperlink("http://SECRET/tickets/'+valueTicket+'";"'+valueTicket+'")');
doc.getSheets()[0].getRange('h'+count).setBackgroundColor('#1BE039');
doc.getSheets()[0].getRange('i'+count).setValue('OK');
doc.getSheets()[0].getRange('i'+count).setBackgroundColor('#1BE039');
}
else
{
doc.getSheets()[0].getRange('i'+count).setValue('FAIL');
break;
return;
}
}
// Clean up - get the UiApp object, close it, and return
app.close();
// The following line is REQUIRED for the widget to actually close.
return app;
}
String.prototype.ReplaceAll = function(stringToFind,stringToReplace){
var temp = this;
var index = temp.indexOf(stringToFind);
while(index != -1){
temp = temp.replace(stringToFind,stringToReplace);
index = temp.indexOf(stringToFind);
}
return temp;
}
function replaceBR(input)
{
return input.ReplaceAll('<br>','
');
}
function replaceA(input)
{
input = input.ReplaceAll('<a>',' ');
input = input.ReplaceAll('</a>',' ');
return input;
}
function clearA(input)
{
return input.replace(/<a>.*<\/a>/g,'<a></a>');
}
最佳答案
您原来的 findThelastRow(column,index)
函数有一个从事件工作表的 0 到 lastRow 的循环,但随后使用(最终)寻址其他工作表中的范围这个循环值。其他工作表中可能不存在该行索引。
多年来,您可能对此没有任何问题,具体取决于不同工作表中存在多少行,但也许现在这种情况正在发生......
为了防止这种风险,我建议在 findThelastRow
函数中尝试这样做:
function findThelastRow(column,index){
var doc = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = doc.getSheets()[index].getLastRow();// check last row on the appropriate sheet
for(var i=2;i<=lastRow+1;i++)
{
if(doc.getSheets()[index].getRange(column+i).getValue()=="")
{
return i;
break;
}
}
return 0;
}
编辑:这个函数可以是 written more efficiently不在相当慢的循环中使用 getValue()
...这是一个使用数组的兼容版本:(你可以替换它而不做任何改变)
function findThelastRow(column,index){
var doc = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = doc.getSheets()[index].getLastRow()+1;// check last row on the appropriate sheet
var coldata = doc.getSheets()[index].getRange(column+2+':'+column+lastRow).getValues();// I begin on Row 2 just as you did
for(i=coldata.length-1;i>=0;i--){
if(coldata[i][0]!=''){return i+2;break}
}
return 0;
}
关于javascript - 电子表格中的 Google Apps 脚本错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11218440/
我这里有一个工作示例。 https://developers.google.com/google-apps/spreadsheets/我需要从用户的谷歌文档下载一些文件。 import com.goo
我需要您在以下方面的帮助: 假设我们有 3 个不同的组:(A、B、C) 我们在每个组中有几个值范围: (Eg. A has 0 - 100, 101 - 200 while B has 0 - 200
谁能告诉我有什么方法可以从 python 连接到电子表格吗?我想从表单中存储一些数据并将其提交到谷歌电子表格。请帮助解决这个问题。我必须遵循哪些步骤? 提前致谢... 最佳答案 连接到 Google
我正在尝试计算 2019 年给定时间范围内的月数。 我的数据如下所示: 我将开始日期和结束日期列的格式更改为“日期”。 “以月为单位的持续时间”和输出列具有数字格式。 我接近它如下: 如果开始日期(年
在设计上有一点问题,希望我能在这里寻求建议。接受 grails 可能是完全错误的工具,但这就是生活。 所以一直在努力开发一个网络应用程序,该应用程序基本上只是从谷歌电子表格中呈现大量信息并发回一些更新
我正在设计一个胖客户端(即非浏览器)Python 应用程序,它将与托管数据库进行通信。该应用程序的屏幕之一需要有一个网格/电子表格区域,允许显示多行数据、过滤、排序和更新多行信息。有人推荐一个具有此功
我在 Django 中有一个表单,可以将用户添加到 mySQL 数据库。然而,用户将不得不添加大量用户,并且一些信息将被复制和粘贴。所以我在想是否有一种方法可以有一个类似表单的电子表格,其中列标题是将
我在 Outlook VBA 中编写了一个程序,它根据 Excel 电子表格的内容创建一些电子邮件。一切正常,但是当程序终止时,我继续运行“EXCEL.EXE”进程,该进程会锁定电子表格,因此其他人无
如何使用公式来确定当前时区? 我使用的公式给出了意想不到的结果。 我的电子表格设置(文件 > 电子表格设置...): 时区: (GMT+01:00) 阿姆斯特丹 我使用的公式: =TEXT(NOW()
如何转换持续时间的小时数? 示例:在单元格 A1 中,我有 176 . 我希望单元格 A2 有 176:00:00 我想在 176 小时(持续时间)内转换数字 176。那可能吗?因为如果我在单元格中键
我收到了 4 个不同的采购订单,上面有一个随机的采购订单编号。 我仅在 A 列中填写采购订单号。 对于这个例子,我收到了下面列出的 4 个不同的采购订单。 采购订单 697533 - 2 项 采购订单
我需要编写循环遍历数据列的程序。根据单元格值和代表变量的每一列重置变量。 练习中的变量取决于循环的这些值。 如何在循环的每次迭代中将值增加 1 来循环遍历行? df=pd.DataFrame(r'C:
我正在做一些详尽的搜索,需要确定新域 (URL) 是否已经在电子表格中。但是,没有一个电子表格对象具有搜索功能,即在大多数文档对象中找到的 findText()。我觉得我错过了一些重要的东西。 我错过
我正在尝试在 Pandas 中导入一个 excel 电子表格,但由于数据“由用户在视觉上构建”以在视觉上对用户友好并且没有使用正确的数据结构,因此我遇到了一些问题。 结果,当在 Pandas 中作为数
我必须在 HTML 页面上显示多个图表,但我无法进行多个查询(直接在 google 电子表格上)。 实际上,我只是第一个查询显示的是谁。 我的代码: Page de pilotage
我使用以下代码作为将 html 网站上的用户输入数据发送到 Google 电子表格的方法: Javascript: function postContactToGoogle() { v
我有一个使用 Google Drive 和电子表格 API 的网站。我想要做的是,如果没有找到具有特定条件的电子表格,则在用户的 Google 云端硬盘上创建电子表格。该电子表格应该是我的 Googl
我目前链接到六个 Excel 电子表格,主要是因为用户在 Excel 中编辑数据更容易/更好(他们从未使用过 Access),而且任何更改都会立即反射(reflect),包括是否有新列添加后即可立即供
我正在努力通过 PowerShell 添加指向可变长度电子表格的链接,无论如何我都会遇到错误。这是我目前正在尝试制作的循环,它嵌套在一个 excel comobject 中, $sheet 代表 $e
在 Excel 电子表格中编写许多工作表可能需要一段时间。并行化它会很有帮助。 此代码运行良好,它使一个 Excel 电子表格在屏幕上弹出,其中包含四个名为 Sheet1、1、2 的工作表 和 3。
我是一名优秀的程序员,十分优秀!