2015-10-30 25 views
0

我尝试使用google apps脚本通过freshdesk API创建具有附件的票证。通过UrlFetchApp创建具有Google应用程序脚本附件的Freshdesk票务

Freshdesk的谷歌应用脚​​本示例代码在这里:https://github.com/freshdesk/fresh-samples/tree/master/google_script,但没有附件演示。

我试过下面的代码,但它似乎总是通过/helpdesk/tickets.json api返回错误。

如何使用UrlFetchApp在Google应用程序脚本中发布附件?

function createFreshdeskTicketWithAttachments() { 

var API_KEY = PropertiesService.getScriptProperties().getProperty('FreshDeskApiKey') 
    if (!API_KEY) throw new Error('FreshDeskApiKey not found in script properties.') 

    var ENDPOINT = Utilities.formatString('https://%s.freshdesk.com', 'zixia') 

    var headers = { 
    'Authorization': 'Basic ' + Utilities.base64Encode(API_KEY + ':X') 
    , 'Content-type': 'application/json' 
    //'Content-type': 'multipart/form-data' 
    }; 

    var response = UrlFetchApp.fetch("https://circleci.com/gh/AKAMobi/ucapp/tree/master.svg?style=svg") 
    var fileBlob = response.getBlob() 
    Logger.log("%s:%s" 
      , response.getResponseCode() 
      , fileBlob.getContentType() 
      ) 

    var payload = { 
    helpdesk_ticket: { 
     description: 'TEST 4' 
     , subject: "TEST 4" 
     , email: "[email protected]" 
     , priority: 1 
     , status: 2 
     , attachments: { '': [ { resource: fileBlob } ] } 
    } 
    } 

    //Adds the extensions that are needed to post a new ticket to the end of the url 
    var url = ENDPOINT + '/helpdesk/tickets.json'; 

    var options = { 
    'method': 'post', 
    'headers': headers, 
    'payload': JSON.stringify(payload), 
// 'payload': payload, 
    muteHttpExceptions: true 
    }; 

    var response = UrlFetchApp.fetch(url, options); 

    Logger.log('resp: %s, %s' 
      , response.getResponseCode() 
      , response.getContentText() 
      ) 

} 

回答

0

UPDATE二零一六年一月二十零日

我写了一个名为GasFreshdesk用于气体的Freshdesk V2 API库,非常易于使用(带附件的支持):

var MyFreshdesk = new GasFreshdesk('https://domain.freshdesk.com', 'TOKEN') 

var ticket = new MyFreshdesk.Ticket({ 
    description:'A description' 
    , subject: 'A subject' 
    , email: '[email protected]' 
    , attachments: [ 
    Utilities.newBlob('TEST DATA').setName('test-data.dat') 
    , Utilities.newBlob('TEST DATA2').setName('test-data2.dat') 
    ] 
}) 

ticket.assign(9000658396) 
ticket.note({ 
    body: 'Hi tom, Still Angry' 
    , private: true 
    , attachments: [ 
    Utilities.newBlob('TEST DATA').setName('test-data.dat') 
    , Utilities.newBlob('TEST DATA2').setName('test-data2.dat') 
    ] 
}) 
ticket.reply({ 
    body: 'Hi tom, Still Angry' 
    , cc_emails: ['[email protected]'] 
    , attachments: [ 
    Utilities.newBlob('TEST DATA').setName('test-data.dat') 
    , Utilities.newBlob('TEST DATA2').setName('test-data2.dat') 
    ] 
}) 
ticket.setPriority(2) 
ticket.setStatus(2) 

ticket.del() 
ticket.restore() 

Logger.log('ticket #' + ticket.getId() + ' was set!') 

GasFreshdesk Github上:https://github.com/zixia/gas-freshdesk

旧文章:

finnaly,谷歌的Apps脚本可以通过UrlFetchApp.fetch多附件附加到新的机票上的Freshdesk,由本人提出“多” PARAM发电机辅助功能的手。

  1. 放附件在另一个阵列有效载荷:

    变种有效载荷= [ [ 'helpdesk_ticket [描述]', '测试JJJJ'] ,[ 'helpdesk_ticket [主题]', '测试JJ' ] ,['helpdesk_ticket [email]','[email protected]'] ,['helpdesk_ticket [attachments] [] [resource]',fileBlob2] ,['helpdesk_ticket [attachments] [] [resource]' ,fileBlob1] ]

  2. use makeMultipartB ODY函数以生成requestBody:

    变种multipartBody = makeMultipartBody(有效载荷)

全码这里:

function createTicket2() { 

    var API_KEY = PropertiesService.getScriptProperties().getProperty('FreshDeskApiKey') 
    if (!API_KEY) throw new Error('FreshDeskApiKey not found in script properties.') 

    var ENDPOINT = Utilities.formatString('https://%s.freshdesk.com', 'zixia') 

    var headers = { 
    'Authorization': 'Basic ' + Utilities.base64Encode(API_KEY + ':X') 
    } 

    var response = UrlFetchApp.fetch("https://circleci.com/gh/AKAMobi/ucapp/tree/master.svg?style=svg") 
    var fileBlob1 = response.getBlob() 

    var fileBlob2 = UrlFetchApp 
    .fetch("http://imgcache.qq.com/open_proj/proj_qcloud_v2/qcloud_2015/css/img/global/internet-plus.png") 
    .getBlob() 

    var payload = [ 
    ['helpdesk_ticket[description]', 'test jjjj'] 
    , ['helpdesk_ticket[subject]', 'test jj'] 
    , ['helpdesk_ticket[email]', '[email protected]'] 
    , ['helpdesk_ticket[attachments][][resource]', fileBlob2] 
    , ['helpdesk_ticket[attachments][][resource]', fileBlob1] 
    ] 

    var boundary = '-----CUTHEREelH7faHNSXWNi72OTh08zH29D28Zhr3Rif3oupOaDrj' 

    payload = makeMultipartBody(payload, boundary) 

    //Logger.log('payload: %s', payload) 
    //return 

    var options = { 
    'method': 'post' 
    , contentType: "multipart/form-data; boundary=" + boundary 
    , 'headers': headers 
    , 'payload': payload 
    , muteHttpExceptions: true 
    } 

    var url = ENDPOINT + '/helpdesk/tickets.json' 
// url = 'http://211.99.222.55:3333' 
    var response = UrlFetchApp.fetch(url, options) 

    Logger.log('resp: %s, %s' 
      , response.getResponseCode() 
      , response.getContentText() 
      )  
} 


function makeMultipartBody(payload, boundary) { 

    var body = Utilities.newBlob('').getBytes() 
    Logger.log(payload) 

    for (var i in payload) { 
    var [k, v] = payload[i] 

    Logger.log('############ %s = %s', k, v) 

    if (v.toString() == 'Blob') { 

     // attachment 
     body = body.concat(
     Utilities.newBlob(
      '--' + boundary + '\r\n' 
      + 'Content-Disposition: form-data; name="' + k + '"; filename="' + v.getName() + '"\r\n' 
     + 'Content-Type: ' + v.getContentType() + '\r\n\r\n' 
    ).getBytes()) 

     body = body 
     .concat(v.getBytes()) 
     .concat(Utilities.newBlob('\r\n').getBytes()) 

    } else { 

     // string 
     body = body.concat(
     Utilities.newBlob(
      '--'+boundary+'\r\n' 
      + 'Content-Disposition: form-data; name="' + k + '"\r\n\r\n' 
      + v + '\r\n' 
     ).getBytes() 
    ) 

    } 

    } 

    body = body.concat(Utilities.newBlob("\r\n--" + boundary + "--\r\n").getBytes()) 

    return body 

} 
0

使用后的调试与NC:

nc -l 211.99.222.55 3333 

我发现有效载荷数组应该这样写:

var payload = { 
    'helpdesk_ticket[description]': 'test jjjj' 
    , 'helpdesk_ticket[subject]': 'test jj' 
    , 'helpdesk_ticket[email]': '[email protected]' 
    , 'helpdesk_ticket[attachments][][resource]': fileBlob1 
    , 'helpdesk_ticket[attachments][][resource]': fileBlob2 
    } 

但fileBlob2不会发布到服务器,因为阵列的关键是复制。我试图将'helpdesk_ticket [attachments] [] [resource]'更改为'helpdesk_ticket [attachments] [1] [resource]',但它不起作用。

所以这里是一个可行的版本,仅支持单个附件:

function createTicket() { 

    var API_KEY = PropertiesService.getScriptProperties().getProperty('FreshDeskApiKey') 
    if (!API_KEY) throw new Error('FreshDeskApiKey not found in script properties.') 

    var ENDPOINT = Utilities.formatString('https://%s.freshdesk.com', 'zixia') 

    var headers = { 
    'Authorization': 'Basic ' + Utilities.base64Encode(API_KEY + ':X') 
    } 

    var response = UrlFetchApp.fetch("https://circleci.com/gh/AKAMobi/ucapp/tree/master.svg?style=svg") 
    var fileBlob1 = response.getBlob() 

    var fileBlob2 = UrlFetchApp 
    .fetch("http://imgcache.qq.com/open_proj/proj_qcloud_v2/qcloud_2015/css/img/global/internet-plus.png") 
    .getBlob() 

    var payload = { 
    'helpdesk_ticket[description]': 'test jjjj' 
    , 'helpdesk_ticket[subject]': 'test jj' 
    , 'helpdesk_ticket[email]': '[email protected]' 
    , 'helpdesk_ticket[attachments][][resource]': fileBlob1 
    , 'helpdesk_ticket[attachments][][resource]': fileBlob2 
    } 
// 
// for (var i=0; i<attachments.length; i++) { 
// payload['helpdesk_ticket[attachments][][resource]'] = attachments[i] 
// } 
// 
// for (var k in payload) { 
// Logger.log('%s = %s', k, payload[k]) 
// } 

    var options = { 
    'method': 'post' 
    , 'headers': headers 
    , 'payload': payload 
    , muteHttpExceptions: true 
    } 

    var url = ENDPOINT + '/helpdesk/tickets.json' 
// url = 'http://211.99.222.55:3333' 
    var response = UrlFetchApp.fetch(url, options) 

    Logger.log('resp: %s, %s' 
      , response.getResponseCode() 
      , response.getContentText() 
      )  

} 
相关问题