Status code error while posting json data using google script - google-apps-script

I was writing an app script to send an sms. In the sms api document section, it's written that with the following, sms can be sent:
POST http://clients.muthofun.net/api/v3/sendsms/json
Host: http://clients.muthofun.net
Content-Type: application/json
Accept: */*
{
"authentication":{
"username":"test",
"password":"test"
},
"messages":[
{
"sender":"044XXXXXXXX",
"text":"Hello",
"recipients":[
{
"gsm":"88017XXXXXXXX"
}
]
}
]
}
So I write the following script code,
modified as #Tanaike said
function myFunction() {
var _auth = {
"username": "*****",
"password": "*****"
};
var rec = {
"gsm": "xxxxxxxxxxx"
};
var msg = {
"sender": "xxxxxxxxxxx",
"text": "Hello",
"recipients": [rec]
};
var payload = {
"authentication": _auth,
"messages": [msg]
};
_payload = JSON.stringify(payload)
var options = {
'method' : 'POST',
'contentType': 'application/json',
"accept": "*/*",
"payload": _payload
};
var url = "http://clients.muthofun.net/api/v3/sendsms/json";
var response = UrlFetchApp.fetch(url, options);
Logger.log(response);
}
But the actual response is:
{
"results":[
{
"status":"0",
"messageid":"10210011344550330860",
"destination":"88017XXXXXXXX"
}
]
}
but from the Logger function I get the following response
{
"results":[
{
"status":"-5",
"messageid":"",
"destination":"8801552555645"
}
]
}
Is it because I missed out a square bracket in the recipients and messages section? Or I am doing something wrong while sending the post request to the url?

How about this modification? In your sample request body, messages is as follows.
{
"authentication": {
"username": "test",
"password": "test"
},
"messages": [
{
"sender": "044XXXXXXXX",
"text": "Hello",
"recipients": [
{
"gsm": "88017XXXXXXXX"
}
]
}
]
}
In your script, it is as follows.
{
"authentication": {
"username": "*****",
"password": "*****"
},
"messages": {
"sender": "xxxxxxxxxxx",
"text": "Hello",
"recipients": {
"gsm": "xxxxxxxxxxx"
}
}
}
In your script, the values of messages and recipients are not array. So how about this modification?
Modified script :
From :
var msg = {
"sender": "xxxxxxxxxxx",
"text": "Hello",
"recipients": rec
};
var payload = {
"authentication": _auth,
"messages": msg
};
To :
var msg = {
"sender": "xxxxxxxxxxx",
"text": "Hello",
"recipients": [rec] // Modified
};
var payload = {
"authentication": _auth,
"messages": [msg] // Modified
};
And accept should be included in headers.
I'm not sure whether this modification resolves your issue, because I cannot test it. If this was not useful for you, can you provide the detail situation of the error?
Edit :
In this modification, option was modified.
var options = {
"method" : "POST",
"contentType": "application/json",
"headers": {"accept": "*/*"}, // Modified
"payload": payload // Modified
};

Rather than doing json request I made a http request to send sms.
Here is the code:
function myFunction() {
var username = "*****";
var password = "****";
var msg = "Harry kane didn't score!!! why!!!! why on August!!! :'(";
var phone = "xxxxxxxxxxx";
var url = "http://clients.muthofun.com:8901/esmsgw/sendsms.jsp?user="+username+"&password="+password+"&mobiles="+phone+"&sms="+msg;
Logger.log(url)
var response = UrlFetchApp.fetch(url);
Logger.log(response);
}

Related

How can I connect the Docusign API using Google Apps Script?

Im trying to connect to the Docusign API using Google Apps Script, but I dont know how to do it. I got my Integration Key and also created a app password because I read in documentation that I needed it.
I would like to know how can I get the access token and how to send envelopes using this API.
I tried with this but it doesnt work
This to get the token:
function obtencionToken() {
var payload = {
"grant_type": "password",
"client_id": PropertiesService.getScriptProperties().getProperty('client_id'),
"username": PropertiesService.getScriptProperties().getProperty('username'), ////The name of the app password I generated
"password": PropertiesService.getScriptProperties().getProperty('password'), //The password of the app password I generated
"scope": "api"
}
var data = generarQuery(payload)
var params = {
"method": 'post',
"headers":
{
"content-type": "application/x-www-form-urlencoded",
},
"payload": JSON.stringify(data),
"muteHttpExceptions": true
}
var response = UrlFetchApp.fetch('https://demo.docusign.net/restapi/v2/oauth2/token', params);
console.log(params);
console.log(response);
console.info(response.getResponseCode())
console.info(response.getContentText())
var access_token_response = JSON.parse(response).access_token;
console.log("access_token_response: " + access_token_response)
/* save token in Propertyservice */
PropertiesService.getScriptProperties().setProperty('token', access_token_response);
return access_token_response;
}
The error of first function is:
Error función 1
This to sent an envelope
function generarQuery(){
var payload = {
//"documents": docs,
"emailSubject": "Request a signature via email example",
"templateId": "<TemplateID>",
"recipients": {
"signers": [
{
"email": full_name,
"name": email_address,
"recipientId": "1",
"routingOrder": "1",
"pageNumbers": "1",
"tabs": {
"signHereTabs": [
{
"anchorString": "Firma Solicitante",
"anchorXOffset": "6.5",
"anchorYOffset": "-0.2",
"anchorIgnoreIfNotPresent": "false",
"anchorUnits": "cms",
}
],
},
}
],
},
"status": "sent"
}
var options2 = {
"method": "post",
"headers":
{
"Authorization": "Bearer"+ token2,
"content-type": "application/json"
},
"payload": JSON.stringify(payload),
"muteHttpExceptions": true
};
var token2 = UrlFetchApp.fetch('https://demo.docusign.net/restapi/v2/accounts/<AccountId>/envelopes', options2);
var id_sobre = (JSON.parse(token2).envelopeId);
console.log(payload);
console.log(options2);
console.log(id_sobre);
console.info(token2.getResponseCode())
console.info(token2.getContentText())
Logger.log(token2)
Logger.log("ID: " + id_sobre)
return id_sobre;
}
The error of second function is:
Error función 2
There should be a space after "Bearer", so this is fixed code:
var options2 = {
"method": "post",
"headers":
{
"Authorization": "Bearer "+ token2,
"content-type": "application/json"
},

Google app scrips Slack API Get pins:list

Using Google app script as serverless for a slack bot. Having an issue returning specific values from slack API. I'm using the pins:list call. I am able to get the JSON in response and items calls but get null when trying to get the next set of values. I am looking to return "permalinks" so I can then post back into slack what items are pinned to a room. here is my script:(without giving away company details)
function GetPinns() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
let url = "https://slack.com/api/pins.list?channel=C0XXXXXXXXX&pretty=1";
let payload = {
"ok": true,
"channel": "C0XXXXXXXXX"
"type": "message",
}
var options = {
"method": "get",
"payload": JSON.stringify(payload),
"headers": {
"Content-type": "application/json; charset=utf-8",
"Authorization": "Bearer xoxb-"}}
var response = UrlFetchApp.fetch(url, options)
var json = response.getContentText();
var data = JSON.parse(json);
var items = data.item.permalinks;
Logger.log(items);
}
Thank you!!
SUGGESTION
Upon reviewing Slack's official docs for pins.list method, I suppose that this sample JSON response below is the same as the actual JSON response that you're getting:
Sample JSON response:
{
"items": [
{
"channel": "C2U86NC6H",
"created": 1508881078,
"created_by": "U2U85N1RZ",
"message": {
"permalink": "https://hitchhikers.slack.com/archives/C2U86NC6H/p1508197641000151",
"pinned_to": [
"C2U86NC6H"
],
"text": "What is the meaning of life?",
"ts": "1508197641.000151",
"type": "message",
"user": "U2U85N1RZ"
},
"type": "message"
},
{
"channel": "C2U86NC6H",
"created": 1508880991,
"created_by": "U2U85N1RZ",
"message": {
"permalink": "https://hitchhikers.slack.com/archives/C2U86NC6H/p1508284197000015",
"pinned_to": [
"C2U86NC6H"
],
"text": "The meaning of life, the universe, and everything is 42.",
"ts": "1503289197.000015",
"type": "message",
"user": "U2U85N1RZ"
},
"type": "message"
}
],
"ok": true
}
You can try iterating though the items array via looping in the JSON response to get each permalinks data, as seen on this quick test below:
Quick Test
function GetPinns() {
//This sample JSON String response was from https://api.slack.com/methods/pins.list#examples
var json =
"{\"items\": [{\"channel\": \"C2U86NC6H\",\"created\": 1508881078,\"created_by\": \"U2U85N1RZ\",\"message\": {\"permalink\": \"https://hitchhikers.slack.com/archives/C2U86NC6H/p1508197641000151\",\"pinned_to\": [\"C2U86NC6H\"],\"text\": \"What is the meaning of life?\",\"ts\": \"1508197641.000151\",\"type\": \"message\",\"user\": \"U2U85N1RZ\"},\"type\": \"message\"},{\"channel\": \"C2U86NC6H\",\"created\": 1508880991,\"created_by\": \"U2U85N1RZ\",\"message\": {\"permalink\": \"https://hitchhikers.slack.com/archives/C2U86NC6H/p1508284197000015\",\"pinned_to\": [\"C2U86NC6H\"],\"text\": \"The meaning of life, the universe, and everything is 42.\",\"ts\": \"1503289197.000015\",\"type\": \"message\",\"user\": \"U2U85N1RZ\"},\"type\": \"message\"}],\"ok\": true}";
var data = JSON.parse(json);
//Iterate through the items via looping
data.items.forEach(item => {
Logger.log(item.message.permalink)
});
}
Result
Your script will look like this:
function GetPinns() {
const ss = SpreadsheetApp.getActiveSpreadsheet()
let url = "https://slack.com/api/pins.list?channel=C0XXXXXXXXX&pretty=1";
let payload = {
"ok": true,
"channel": "C0XXXXXXXXX"
"type": "message",
}
var options = {
"method": "get",
"payload": JSON.stringify(payload),
"headers": {
"Content-type": "application/json; charset=utf-8",
"Authorization": "Bearer xoxb-"
}
}
var data = JSON.parse(json);
//Iterate through the items via looping
data.items.forEach(item => {
Logger.log(item.message.permalink)
});
}
Reference
https://www.sitepoint.com/loop-through-json-response-javascript/
Thank you!!
I wound up with this in the end
var response = UrlFetchApp.fetch(url, options);
var json = JSON.parse(response.getContentText());
var items = json.items
var linkList = ""
for(var x in items) {
var link = items[x]["message"]["permalink"]
var text = items[x]["message"]["text"]
linkList += "<" + link +"|" + text +">" + "\n"
}

Cloud build API deploy:run on Google Apps Script doesn't work

I confirmed authorization with service account on GAS. "list" is work, but "run" method never work. Error msg is "source must not be empty". What kind of json should I attach?
This is on standalone GAS using GSApp library. (Apps-Script-GSApp-Library : MJ5317VIFJyKpi9HCkXOfS0MLm9v2IJHf)
function deploy() {
var jsonKey = JSON.parse(PropertiesService.getScriptProperties().getProperty("jsonKey"));
var serverToken = new GSApp.init(jsonKey.private_key, ["https://www.googleapis.com/auth/cloud-platform"], jsonKey.client_email);
var tokens = serverToken.addUser(jsonKey.client_email).requestToken().getTokens();
var url = "https://cloudbuild.googleapis.com/v1/projects/{ProjectId}/triggers/{TriggerId}:run";
var options = {
"muteHttpExceptions": true,
"method": "POST",
"headers": {
"Authorization":"Bearer "+tokens[jsonKey.client_email].token,
},
"source": {
"projectId": "{ProjectId}",
"branchName": "master",
"repoName": "repo"
}
}
Logger.log(UrlFetchApp.fetch(url,options));
}
{
"error": {
"code": 400,
"message": "source must not be empty",
"status": "INVALID_ARGUMENT"
}
}
UrlFetchApp.fetch() does not recognize "source" as a valid property. Use "payload" instead. Also you'll need to JSON.stringify() your payload and set the contentType property as application/json as follows:
var options = {
"muteHttpExceptions": true,
"method": "POST",
"contentType":"application/json",
"headers": {
"Authorization":"Bearer "+tokens[jsonKey.client_email].token,
},
"payload": JSON.stringify({
"projectId": "{ProjectId}",
"branchName": "master",
"repoName": "repo"
})
};

How to add more ccRecipients in microsoft graph?

I'm using Microsoft Graph to connect with Outlook. Can someone please help me with my issue. I need to add more than one ccRecipient and bccRecipient. My web application sends, receives and reads emails through API. But I cant send email to more than one cc and bcc recipient. This is the function i`m using to send email.
edit: Right now function does not have two ccRecipients and two bccRecipients in JSON. I have tried in many different ways but when i test it in microsoft graph-explorer it fails to send on more than one address.
function sendEmail(){
getAccessToken(function(accessToken) {
if (accessToken) {
// Create a Graph client
var client = MicrosoftGraph.Client.init({
authProvider: (done) => {
// Just return the token
done(null, accessToken);
}
});
var recipient = $("#recipient").val();
var subject = $("#subject").val();
var carbon_copies = $("#carbon_copies").val();
var blind_carbon_copies = $("#blind_carbon_copies").val();
var filename_attachment = $("#filename").text();
var attachments_base64 = $("#attachment_base64").val();
var attachments_base64_replaced = attachments_base64.substring(attachments_base64.indexOf(",")+1);
alert(attachments_base64_replaced);
tinyMCE.triggerSave();
var body = $("#moj_tekst_editor").val();
var body_escape_double_qoute = body.replace(/"/g, '\\"');
//var body_escape_single_qoute = body_escape_double_qoute.replace(/'/g, "\\'");
var body_escape_forward_slash = body_escape_double_qoute.replace("/", "\\/");
var body_escape_forward_slash = body_escape_double_qoute.replace("/", "\\/");
alert(body_escape_forward_slash);
var email = '{"message":{"subject": "'+subject+'","body": {"contentType": "HTML","content": "'+body_escape_forward_slash+'"},"toRecipients": [{"emailAddress": {"address": "'+recipient+'"}}],"ccRecipients": [{"emailAddress": {"address": "'+carbon_copies+'"}}],"bccRecipients": [{"emailAddress": {"address": "'+blind_carbon_copies+'"}}],"attachments":[{"#odata.type":"#Microsoft.OutlookServices.FileAttachment","name":"'+filename_attachment+'","contentBytes":"'+attachments_base64_replaced+'"}]}, "saveToSentItems": "true"}'
console.log(email);
// Send Email
client
.api('/me/sendMail')
.header('Content-Type', "application/json")
.post(email, (err, res) => {
if (err) {
callback(null, err);
} else {
callback(res.value);
}
});
} else {
var error = { responseText: 'Could not retrieve access token' };
callback(null, error);
}
});
}
What do I need to do to be able to send email to more than one ccRecipient and bccRecipient? When I add more than one cc recipient message always comes to last one.
Thanks in advance!!
I found I can send emails to multiple toRecipients or ccRecipients by formatting the emailAddress in the following way:
{
"emailAddress": {
"address": "cc1#email.com"
}
},
{
"emailAddress": {
"address": "cc2#email.com"
}
}
Full request body looks like this:
{
"message": {
"subject": "Meet for lunch?",
"body": {
"contentType": "Text",
"content": "The new cafeteria is open."
},
"toRecipients": [
{
"emailAddress": {
"address": "address1#email.com"
}
},
{
"emailAddress": {
"address": "address2#email.com"
}
}
],
"ccRecipients": [
{
"emailAddress": {
"address": "cc1#email.com"
}
},
{
"emailAddress": {
"address": "cc2#email.com"
}
}
]
},
"saveToSentItems": "true"
}

Use Mandrill API in Google Apps Script

I want to use mandrill email sending api in my google apps script. In google script I have to use JSON code but I am not getting how I will use it. I am very new in Google apps script.
var m = new mandrill.Mandrill('XXXXXXXXXXX');
var from_email = "user4#gmail.com";
var to = '[
{
"email": "recipient.email#example.com",
"name": "Recipient Name"
}
],';
// create a variable for the API call parameters
var params = {
"message": {
"from_email":from_email,
"to":[{"email":to}],
"subject": "Sending a text email from the Mandrill API",
"text": "I'm learning the Mandrill API at Codecademy, it's very difficult."
}
};
function sendTheMail() {
// Send the email!
alert('this is a mail script');
m.messages.send(params, function(res) {
log(res);
}, function(err) {
log(err);
});
}
I am not getting how to use this code in Google Apps Script.
You'd need to use the urlfetchapp.
var url = "https://mandrillapp.com/api/1.0/messages/send.json";
var your_key = "xxxxxxxxxxxxx";
var from_email = "user4#gmail.com";
var to = [{
"email": "recipient.email#example.com",
"name": "Recipient Name"
}];
var params = {
"key": your_key,
"message": {
"from_email":from_email,
"to":[{"email":to}],
"subject": "Sending a text email from the Mandrill API",
"text": "I'm learning the Mandrill API at Codecademy, it's very difficult."
}
};
var payload = JSON.stringify(params);
var options = {
'method': 'post',
'payload': payload,
'contentType' : 'application/json'
};
var response = UrlFetchApp.fetch(url, options);
Haven't tested this code, but should be something like that.
I paste sample code example to send email by Mandrill with attachment file from Google Drive.
function sendEmail() {
var MANDRILL_API_KEY = "<<your key here>>";
var files = [
"<<Google Drive File ID 1>>",
"<<Google Drive File ID 2>>",
"<<Google Drive File ID 3>>"
];
var recipients = [
{
"email": "ctrlq+to#labnol.org",
"name": "Amit Agarwal",
"type": "to"
}, {
"email": "ctrlq+cc#labnol.org",
"type": "cc"
}, {
"email": "ctrlq+bcc#gmail.com",
"type": "bcc"
}
];
var attachments = [];
for (var f in files) {
var file = DriveApp.getFileById(files[f]);
attachments.push({
"type": file.getMimeType(),
"name": file.getName(),
"content": Utilities.base64Encode(file.getBlob().getBytes())
});
}
var params = {
"key": MANDRILL_API_KEY,
"message": {
"from_email": "<<Sender's Email Address>>",
"from_name": "<<Sender Name>>",
"to": recipients,
"attachments": attachments,
"headers": {
"Reply-To": "reply#example.com"
},
"subject": "Enter email subject",
"text" : "Enter email body in plain text",
"html" : "Enter HTML content with <b>tags</b>"
}
};
var response = UrlFetchApp.fetch(
"https://mandrillapp.com/api/1.0/messages/send.json", {
'method': 'POST',
'payload': JSON.stringify(params),
'contentType': 'application/json'
});
Logger.log(response.getContentText());
}
Sample code is extracted from website ctrlq of Amit Agarwal