2012-06-27 113 views
2

截至昨天,我們開始在將Google REST API中的REST API(urlfetch)放入Zendesk時發生錯誤。我們已經使用了1.5年,沒有任何問題。它給出的錯誤是通用的 - 「遇到錯誤:很抱歉,發生服務器錯誤,請稍等一會兒,然後再試一次。」錯誤屏幕截圖 - http://support.prontomarketing.com/attachments/token/j1bjrnw1cpfu4tu/?name=2012-06-27_08-56-19.jpg電子表格中的Google Apps腳本錯誤

Google Apps Script Spreadsheet Services API是否有任何近期更改?

有沒有人有任何想法?

這裏是我們的腳本(注:* URL和令牌爲的Zendesk已被刪除)

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('&','&#38;'); 
    var ticketComment = doc.getSheets()[0].getRange('c'+count).getValue().toString().replace('&','&#38;'); 
    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>','&#xD;'); 
} 

function replaceA(input) 
{ 
    input = input.ReplaceAll('<a>',' '); 
    input = input.ReplaceAll('</a>',' '); 
    return input; 
} 

function clearA(input) 
{ 
    return input.replace(/<a>.*<\/a>/g,'<a></a>'); 
} 
+2

更新。我們發現錯誤是由「doc.getLastRow();」引起的功能。更改爲靜態值可使整個腳本再次正常運行。 'code' 'function findThelastRow(column,index){ var doc = SpreadsheetApp.getActiveSpreadsheet(); var lastRow = doc.getLastRow(); for(var i = 2; i <= lastRow + 1; i ++)' –

+0

函數調用時'index'的值是多少?試圖獲得超過索引表中可用行數的範圍是否存在風險? –

回答

0

你原來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; 
    } 
相關問題