Google Sheets API V4 VB Net BatchUpdate - Upload - vb.net
I am attempting to load the contents of a CSV file directly to an existing Google Sheet using the batch update method.
The problem is that my code is only uploading the last record, but from what I can tell the request object has all the data.
So far I am able to loop through the CSV file and cast each row to a Google Sheets ValueRange and add each ValueRange to a data object in order to apply it to the RequestBody required by the Google Sheets API.
This is all based on the API documentation available from Google.
Google Sheets API V4 Batch Update
I tossed in a few Message Boxes just to see what is happening in the background.
Below is the code I am using currently, and a sample set of data you can put into a csv file to run.
It appears that I am missing something with the upload request itself, if anyone has any input or experience with this I can't seem to get past this.
*Note: this code is simply a VB .Net winform app with a single button added to the form.
Imports System.Threading
Imports Google.Apis.Sheets.v4
Imports Google.Apis.Auth.OAuth2
Imports Google.Apis.Services
Imports Microsoft.VisualBasic.FileIO
Imports Google.Apis.Sheets.v4.Data
Imports Data = Google.Apis.Sheets.v4.Data
Public Class Form1
Dim ClientID As String = "<GOOGLE CLIENT>.apps.googleusercontent.com"
Dim ClientSecret As String = "<CLIENT SECRET>"
Dim Scopes As String() = {SheetsService.Scope.Spreadsheets}
Dim credential As UserCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(New ClientSecrets() With {.ClientId = ClientID,
.ClientSecret = ClientSecret},
Scopes, "user",
CancellationToken.None).Result
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim r As Integer = 1
Dim oblist = New List(Of Object)
Dim sheetsService As SheetsService = New SheetsService(New BaseClientService.Initializer With {
.HttpClientInitializer = credential,
.ApplicationName = "Google-SheetsSample/0.1"
})
Dim spreadsheetId As String = "<SPREADSHEET ID>"
Dim valueInputOption As String = "RAW"
Dim valueRanges As ValueRange = New ValueRange()
Dim data As List(Of Data.ValueRange) = New List(Of Data.ValueRange)
Dim tfp As New TextFieldParser("<PATH TO CSV FILE I WANT TO UPLOAD>")
tfp.SetDelimiters(",")
tfp.TextFieldType = FieldType.Delimited
'tfp.ReadLine() ' skip header
While tfp.EndOfData = False
Dim fields = tfp.ReadFields()
Dim range2 As String = "A" & r ' range to update
valueRanges.MajorDimension = "ROWS" '"ROWS";//COLUMNS
valueRanges.Range = range2 ' apply range to ValueRnage
' My csv has 12 fields
oblist = New List(Of Object)() From {
fields(0), fields(1), fields(2), fields(3), fields(4), fields(5), fields(6), fields(7), fields(8), fields(9), fields(10), fields(11)
}
valueRanges.Values = New List(Of IList(Of Object)) From { ' add list of objects pulled from TextFieldParser to ValueRange
oblist
}
data.Add(valueRanges) ' Add valueRange to data for RequestBody
r += 1 ' Increment Range
End While
MsgBox("Count of value ranges in data object : " & data.Count)
Dim requestBody As Data.BatchUpdateValuesRequest = New Data.BatchUpdateValuesRequest()
requestBody.ValueInputOption = valueInputOption
requestBody.Data = data
MsgBox("Request body data : " & requestBody.Data.Count)
Dim request As SpreadsheetsResource.ValuesResource.BatchUpdateRequest = sheetsService.Spreadsheets.Values.BatchUpdate(requestBody, spreadsheetId)
Dim response As Data.BatchUpdateValuesResponse = request.Execute()
MsgBox("Count of Rows uploaded to google sheet : " & response.TotalUpdatedRows)
End Sub
End Class
CSV - EXAMPLE -
Column 1,Column 2,Column 3,Column 4,Column 5,Column 6,Column 7,Column 8,Column 9,Column 10,Column 11,Column 12
ex12,ex34,ex56,ex78,ex100,ex122,ex144,ex166,ex188,ex210,ex232,ex254
ex13,ex35,ex57,ex79,ex101,ex123,ex145,ex167,ex189,ex211,ex233,ex255
ex14,ex36,ex58,ex80,ex102,ex124,ex146,ex168,ex190,ex212,ex234,ex256
ex15,ex37,ex59,ex81,ex103,ex125,ex147,ex169,ex191,ex213,ex235,ex257
ex16,ex38,ex60,ex82,ex104,ex126,ex148,ex170,ex192,ex214,ex236,ex258
ex17,ex39,ex61,ex83,ex105,ex127,ex149,ex171,ex193,ex215,ex237,ex259
ex18,ex40,ex62,ex84,ex106,ex128,ex150,ex172,ex194,ex216,ex238,ex260
ex19,ex41,ex63,ex85,ex107,ex129,ex151,ex173,ex195,ex217,ex239,ex261
ex20,ex42,ex64,ex86,ex108,ex130,ex152,ex174,ex196,ex218,ex240,ex262
ex21,ex43,ex65,ex87,ex109,ex131,ex153,ex175,ex197,ex219,ex241,ex263
Here I create one code .. The difference is only you pass List to ValueRange whereas there should be IList ..
But for conversion from list to Ilist I used objList.ToList () and I don't know it's drawback you need to check
And also you have to create new object of valueRange within while loop
Dim sheetId = FileId
Dim service = GetGoogleAPPSheetService()
Dim val_range As ValueRange
Dim DataList As List(Of ValueRange) = New List(Of ValueRange)
Dim I As Integer = 0
Dim objList As List(Of Object)
Dim objMainList As List(Of IList(Of Object))
Dim objIlIst As IList(Of Object)
Dim objImainList As IList(Of IList(Of Object))
For Each dr As DataRow In dt.Rows
I += 1
val_range = New ValueRange
val_range.Range = "A" & I.ToString
objList = New List(Of Object) From {dr(0).ToString, dr(1).ToString}
objMainList = New List(Of IList(Of Object)) From {objList.ToList()}
val_range.Values = objMainList.ToList
DataList.Add(val_range)
Next
Dim req_body As BatchUpdateValuesRequest = New BatchUpdateValuesRequest
req_body.ValueInputOption = "RAW"
req_body.Data = DataList.ToList
Dim request As SpreadsheetsResource.ValuesResource.BatchUpdateRequest = service.Spreadsheets.Values.BatchUpdate(req_body, sheetId)
Dim response As BatchUpdateValuesResponse = request.Execute
MsgBox("Count of Rows uploaded to google sheet : " & response.TotalUpdatedRows)
Catch ex As Exception
Throw ex
End Try
Related
System.Threading.Tasks error when trying to call API
I am new to vb.net code. I have to call external API from vb.net. I tried the code below but it is throwing an error - getting issue as System.Threading.Tasks.k`1 Public Shared Async Function GetToken_saka() As Task(Of sakaweb) Dim req As New HttpRequestMessage(HttpMethod.Post, "https://api.qa.se.com/token") ' req.Content = New FormUrlEncodedContent(New Dictionary < String, String > { ' {"client_id", "your client_id"}, ' {"client_secret", "your client_secret"}, ' {"grant_type", "client_credentials"} '}); Dim dct As New Dictionary(Of String, String) dct.Add("client_id", "your_client_id") dct.Add("client_secret", "your_client_secret") dct.Add("grant_type", "client_credentials") Dim htc As New HttpClient req.Content = New FormUrlEncodedContent(dct) Dim response = Await htc.SendAsync(req) response.EnsureSuccessStatusCode() 'Dim payload = JObject.Parse(Await response.Content.ReadAsStringAsync()) Dim payload = JsonConvert.DeserializeObject(response.ToString) Dim token = payload.Value(Of String)("access_token") Dim t1 As sakaweb = Nothing Return t1 'Dim t1 As New Task("K") 'Return t1 End Function
BatchUpdate Rows in Google Sheets using VB.Net
Im having trouble updating rows in Google Sheets using VB.Net. This is my code: Dim service = New SheetsService(New BaseClientService.Initializer() With {.HttpClientInitializer = credential, .ApplicationName = ApplicationName}) Dim spreadsheetId As String = "1mW-ndDolz_uECCMmAmKZ-sANoM9H53eqc231g98I06U" Dim spreadsheet As Spreadsheet = Nothing Dim content As BatchUpdateSpreadsheetRequest = New BatchUpdateSpreadsheetRequest() Dim request As Request = New Request() Dim deleteDimensionRequest As DeleteDimensionRequest = New DeleteDimensionRequest() Dim dimensionRange As DimensionRange = New DimensionRange() dimensionRange.Dimension = "A:B" dimensionRange.StartIndex = 0 dimensionRange.EndIndex = 3 dimensionRange.SheetId = 0 deleteDimensionRequest.Range = dimensionRange Dim requests As IList(Of Object) = New List(Of Object)() requests.Add(request) content.Requests = requests Try service.Spreadsheets.BatchUpdate(content, spreadsheetId) Catch e As IOException MsgBox(e.Message) End Try It shows me an Error saying Unable to cast object of type 'System.Collections.Generic.List1[System.Object]' to type 'System.Collections.Generic.IList1[Google.Apis.Sheets.v4.Data.Request]'. What Am I doing wrong here?
I have no idea how VB.NET works, but based on your sample code and the error message, I would assume the problem is this line: Dim requests As IList(Of Object) = New List(Of Object)() It should probably be: Dim requests As IList(Of Request) = New List(Of Request)()
I am sure its working but I don't know its drawbacks Dim requests As IList(Of Request) dim Req1 as List(Of Request) = new List(Of Request) Req1.Add(request) Requests = Req1.ToList() content.Requests = requests
Vb.net webclient error : too many automatic redirections was attempted
This code was running just fine before , but since yesterday the error started to show up. After reading many similar disscutions i though that my problem was about cookies so i add a CookieContainer but i still get the same error. My code allows me to get pictures and their titles from a website and display them , here is my code: Form 1 : Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click Dim websiteURL1 As String = "http://www.gamestop.com/collection/upcoming-video-games" Class1.getPics(websiteURL1, "<img src=""(?<Data>[^>]*)""><p>(?<Dataa>[^>]*)<br>") Me.AutoScroll = True End Sub Class1 fucntion : Public Shared Function getPics(website As String, pattern As String) Dim tempTitles As New List(Of String)() Dim tempTitles2 As New List(Of String)() Dim lestitres As New List(Of titlesclass) Dim webClient As New CookieAwareWebClient() webClient.Headers.Add("user-agent", "null") 'If the website happens to go offline, at least your application wont crash. 'Handle default proxy Dim proxy As IWebProxy = WebRequest.GetSystemWebProxy() proxy.Credentials = CredentialCache.DefaultCredentials webClient.Proxy = proxy Dim content As String = webClient.DownloadString(website) Dim query = From title In Regex.Matches(content, pattern).Cast(Of Match) Select New With {Key .Link = String.Concat("http://www.gamestop.com", title.Groups("Data").Value), Key .Title = title.Groups("Dataa").Value} Dim titles = tempTitles.Distinct().ToArray() 'remove duplicate titles Dim titles2 = lestitres.Distinct().ToArray() lestitres.Clear() 'Count Items Dim item As Integer = 0 'Count Row Dim row As Integer = 0 'image: 222*122 For Each letitre In query.Distinct Dim ImageInBytes() As Byte = webClient.DownloadData(letitre.Link) Dim ImageStream As New IO.MemoryStream(ImageInBytes) Dim MyPic As New PictureBox Dim MyLab As New Label 'x = numéro item fois largeur image 'y = numéro de ligne fois hauteur image MyPic.Location = New Point(item * 222, row * 122) MyLab.Location = New Point(item * 222, row * 122) MyPic.SizeMode = PictureBoxSizeMode.AutoSize MyLab.Text = letitre.Title MyPic.Image = New System.Drawing.Bitmap(ImageStream) Form2.Controls.Add(MyPic) Form2.Controls.Add(MyLab) 'Bring Labels to front For Each ctrl As Control In Form2.Controls 'If the control is of type button If TypeOf ctrl Is Label Then 'Then disable it ctrl.BringToFront() End If Next 'Increment the item count item = item + 1 'If item is multiple of 4 or could check 4 then If item Mod 4 = 0 Then 'Reset counter item = 0 'Increment Row row = row + 1 End If Next End Function CookieContainer WebClient class : Imports System.Net Imports System.Text.RegularExpressions Public Class CookieAwareWebClient Inherits WebClient Private cc As New CookieContainer() Private lastPage As String Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest Dim R = MyBase.GetWebRequest(address) If TypeOf R Is HttpWebRequest Then With DirectCast(R, HttpWebRequest) .CookieContainer = cc If Not lastPage Is Nothing Then .Referer = lastPage End If End With End If lastPage = address.ToString() Return R End Function End Class
The website did add a new function which detect automatically the webclient location (country) and redirect them to another website , so in my case i set my webclient proxy to the USA so it can visit the link i want to without redirections. To add the proxy settings you can use : webclient1.Proxy = New WebProxy("YourProxyServerName", port) For exemple webClient.Proxy = New WebProxy("100.12.34.36", 8080) Here is a list of free usa proxys : https://www.us-proxy.org/
Connecting a VB.NET application with a Google Docs Spreadsheet
I'm creating a small application that can order stuff. The way a user can order something is to input the correct information through a google form, which then would be automatically converted to a Google Spreadsheet. Now, I want to connect it to my VB application. How can I do that?
You should install sheetsapi v4 to your app. Here is the code: Public Class Form3 Shared Scopes As String() = {SheetsService.Scope.SpreadsheetsReadonly} Shared ApplicationName As String = "Google Sheets API .NET Quickstart" Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim credential As UserCredential Using stream = New FileStream("client_secret.json", FileMode.Open, FileAccess.Read) Dim credPath As String = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) credPath = Path.Combine(credPath, ".credentials/sheets.googleapis.com-dotnet-quickstart.json") credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, New FileDataStore(credPath, True)).Result Console.WriteLine(Convert.ToString("Credential file saved to: ") & credPath) End Using Dim service = New SheetsService(New BaseClientService.Initializer() With { _ .HttpClientInitializer = credential, _ .ApplicationName = ApplicationName }) Dim spreadsheetId As [String] = "your sheet id" Dim range As [String] = "A2:F" Dim request As SpreadsheetsResource.ValuesResource.GetRequest = service.Spreadsheets.Values.[Get](spreadsheetId, range) Dim response As ValueRange = request.Execute() Dim values As IList(Of IList(Of [Object])) = response.Values Dim son As String If values IsNot Nothing AndAlso values.Count > 0 Then ListBox1.Items.Add("Name, Major") For Each rol In values son = rol(0) + " " + rol(1) + " " + rol(2) + " " + rol(4) ' Print columns A and E, which correspond to indices 0 and 4. ListBox1.Items.Add(son) Next End If End Sub End Class
Request Signature Docusign Rest API vb.net
am trying to use the DocuSign .Net Client to request a signature on a Document I am creating dynamically. So far, I have been able to change the example to vb.net and it works (Exmaple CS). I was converting the "Walkthrough #4 - Request Signature on Document", about 1/2 way down the code. Now I am trying to use the Envelope.Document I've seen in other examples, such as, DocuSign example. But it seems .Document is not part of Envelope, even thought the rest of the code in both examples translates to vb. My other option is to use the Envelope.AddDocument but I can't seem to figure out what it's expecting. I am supposed to pass fileBytes() as Byte, fileName as String, and index As Integer. I've tried a couple different methods to get the fileBytes but keep getting an error about Invalid_Content_Type Content type is not supported. Here is the code I've been trying. Any help on how to add a Document to an Envelope would be appreciated. Ultimately I want to be able to add multiple documents to the one envelope. I can get the env.Create(docPath) to work, but that is not helpful. Thank you in advance for any help you can offer. Public Function RequestEsignature(email As String, rName As String, docPath As String, strSubject As String) As String main() Dim AccountEmail = My.Settings.docusignUserName Dim AccountPassword = My.Settings.docusignPassword Dim RecipientEmail = email Dim RecipientName = rName Dim documentPath = docPath Dim msgString As String Dim acct As Account = New Account() acct.Email = AccountEmail acct.Password = AccountPassword Dim result As Boolean = acct.Login() If Not result Then msgString = String.Format("There was an error logging in to DocuSign fo user {0}.\nError Code: {1}\nMessage: {2}", acct.Email, acct.RestError.errorCode, acct.RestError.message) MsgBox(msgString) Return Nothing End If Dim env As Envelope = New Envelope env.Login = acct env.Recipients = New Recipients() Dim signer(0) As Signer signer(0) = New Signer() signer(0).email = email signer(0).name = RecipientName signer(0).routingOrder = "1" signer(0).recipientId = "1" env.Recipients.signers = signer Dim envDocs = New Document() envDocs.documentId = "1" envDocs.name = "Test Document" envDocs.uri = docPath 'Dim fileBytes As Byte() 'Dim fileBytes = getByteArrayII(documentPath) 'Dim oFile As FileInfo 'oFile = New FileInfo(documentPath) 'Dim oFileStream As FileStream = oFile.OpenRead() 'Dim lBytes As Long = oFileStream.Length 'If lBytes > 0 Then ' Dim fileData(lBytes - 1) As Byte ' oFileStream.Read(fileData, 0, lBytes) 'If Not env.AddDocument(fileBytes, documentPath, 0) Then ' msgString = String.Format("The was an Error adding the Document." & vbCrLf & "Error Code: {0} " & vbCrLf & "Message: {1}", env.RestError.errorCode, env.RestError.message) ' MsgBox(msgString) ' Return Nothing 'Else ' MsgBox("Doc Successfully Added") 'End If 'oFileStream.Close() 'End If env.Status = "sent" env.EmailSubject = strSubject result = env.Create() If Not result Then If Not IsNothing(env.RestError) Then msgString = String.Format("Error Code: {0}\nMessage: {1}", env.RestError.errorCode, env.RestError.message) MsgBox(msgString) Return Nothing Else MsgBox("There was a nondescript error while processing this request. \nPLease verify all information is correct before trying again.") Return Nothing End If Else Return env.EnvelopeId End If End Function Private Function getByteArray(fileName As String) As Byte() Dim fInfo As New FileInfo(fileName) Dim numBytes As Long = fInfo.Length Dim fStream As New FileStream(fileName, FileMode.Open, FileAccess.Read) Dim br As New BinaryReader(fStream) Dim data As Byte() = br.ReadBytes(CInt(numBytes)) br.Close() fStream.Close() Return data End Function Private Function getByteArrayII(ByVal fileName As String) As Byte() Dim tempByte() As Byte = Nothing If String.IsNullOrEmpty(fileName) Then Throw New ArgumentNullException("FileName Not Provided") Return Nothing End If Try Dim fileInfo As New FileInfo(fileName) Dim numBytes As Long = fileInfo.Length Dim fStream As New FileStream(fileName, FileMode.Open, FileAccess.Read) Dim binaryReader As New BinaryReader(fStream) tempByte = binaryReader.ReadBytes(Convert.ToInt32(numBytes)) fileInfo = Nothing numBytes = 0 fStream.Close() fStream.Dispose() Return tempByte Catch ex As Exception Return Nothing End Try End Function HISTORY I am new to vb.net and programming. Thus far I have been able to make a program that allows users to enter client information with the forms being changed based on certain selections. We have a system that uses our SQL data to do mail merges in Word and then send a PDF for esignature to the client through DocuSign. We are using a SQL backend and a vb.net front end. Lastly, I have been looking for an answer over the weekend and am now reaching out for help. I have searched google for every possible term(s) I can think to include/exclude. If I am asking publicly that truly means I have exhausted every resource I have. Please do not post links to any DocuSign Documentation as I have already visited all those sites. Thank you.
It doesn't appear that the Envelope class has a Document property, but rather a Documents property which seems to be an array. The C# example you posted at this link seems to show how to attach a document: // Attach the document(s) C# envelope.Documents = new DocuSignWeb.Document[1]; DocuSignWeb.Document doc = new DocuSignWeb.Document(); doc.ID = "1"; doc.Name = "Document Name"; doc.PDFBytes = [Location of Document]; envelope.Documents[0] = doc; Which in VB would be something like this: 'Attach the document(s) VB envelope.Documents = new DocuSignWeb.Document(0); Dim doc As New DocuSignWeb.Document() doc.ID = "1" doc.Name = "Document Name" doc.PDFBytes = [Location of Document] envelope.Documents(0) = doc If this is not the problem you are facing, please provide additional details.
Clearly my approach to learning vb, api's and all the other stuff needed to get my program working is extremely daunting. I am not sure if it is my lack of knowledge or just a misunderstanding of the code, but I was finally able to get this figured out. My function takes an object 'client' that has things like Name and Email, I also pass a list of Document Paths and the Subject line for the email. This loops through the list of documents and adds them to the envelope. I also have some examples of adding Tags which was a learning process in itself. I hope I am the only one unfortunate enough to have to be learning so many different new concepts that something this simple takes months to figure out, but if not here's the code: 'Request Signature - Send Envelope Public Function RequestEsignature(pClient As iqClient, docPaths As List(Of String), strSubject As String) As DocuSign.Integrations.Client.Envelope '***************************************************************** ' ENTER VALUES FOR FOLLOWING VARIABLES! '***************************************************************** Dim AccountEmail As String = My.Settings.docusignUserName Dim AccountPassword As String = My.Settings.docusignPassword Dim RecipientEmail As String = pClient.Email Dim RecipientName As String = pClient.Name.NameFL '***************************************************************** ' user credentials Dim account As New Account() account = LoginToDocusign() If Not IsNothing(account) Then End If Dim result As Boolean ' = account.Login() ' create envelope object and assign login info Dim envelope As New Envelope() Dim recip = New Recipients() Dim signers = New List(Of Signer) Dim signer As New Signer() signer.email = RecipientEmail signer.name = RecipientName signer.routingOrder = "1" signer.recipientId = "1" Dim fileBytes = New List(Of Byte()) Dim docNames = New List(Of String) Dim iqDoc As iqPublicClasses.iqDocement Dim docs = New List(Of Document) Dim doc As Document Dim tabs = New List(Of Tab) Dim tab As New Tab() Dim iTabs = New List(Of Tab) Dim iTab As New Tab() Dim dTabs = New List(Of DateSignedTab) Dim dTab As New DateSignedTab Dim rTabs = New List(Of RadioGroupTab) Dim rTab As New RadioGroupTab() Dim radios = New List(Of Radios) Dim radio As New Radios() tab = New Tab() tab.anchorIgnoreIfNotPresent = True tab.anchorString = "\s1\" tabs.Add(tab) dTab = New DateSignedTab dTab.anchorIgnoreIfNotPresent = True dTab.anchorString = "\d1\" dTabs.Add(dTab) iTab = New Tab() iTab.anchorIgnoreIfNotPresent = True iTab.anchorString = "\i1\" iTab.anchorYOffset = 15 iTabs.Add(iTab) iTab = New Tab() iTab.anchorIgnoreIfNotPresent = True iTab.anchorString = "\nri1\" iTabs.Add(iTab) rTab = New RadioGroupTab() rTab.groupName = "RG1" rTab.anchorIgnoreIfNotPresent = True radio = New Radios() radio.anchorString = "\rbn\" radio.anchorIgnoreIfNotPresent = True radio.anchorYOffset = -10 radios.Add(radio) radio = New Radios() radio.anchorString = "\rby\" radio.anchorIgnoreIfNotPresent = True radio.anchorYOffset = -10 radios.Add(radio) rTab.radios = radios.ToArray rTabs.Add(rTab) signer.tabs = New Tabs() signer.tabs.signHereTabs = tabs.ToArray signer.tabs.dateSignedTabs = dTabs.ToArray signer.tabs.initialHereTabs = iTabs.ToArray signer.tabs.radioGroupTabs = rTabs.ToArray Dim cnt = 0 For Each docName As String In docPaths cnt += 1 iqDoc = New iqPublicClasses.iqDocement(docName) doc = New Document() doc.attachmentDescription = iqDoc.Name doc.name = String.Format("{0}{1}", iqDoc.Name, iqDoc.Extension) doc.fileExtension = iqDoc.Extension doc.uri = iqDoc.FullPath doc.documentId = cnt docs.Add(doc) docNames.Add(iqDoc.FullPath) fileBytes.Add(File.ReadAllBytes(iqDoc.FullPath)) Next ' create envelope and send the signature request (since status is set to "sent") envelope.Login = account signers.Add(signer) recip.signers = signers.ToArray envelope.Recipients = recip envelope.Status = "sent" envelope.EmailSubject = strSubject result = envelope.Create(fileBytes, docs) If Not result Then If envelope.RestError IsNot Nothing Then Console.WriteLine("Error code: {0}" & vbLf & "Message: {1}", envelope.RestError.errorCode, envelope.RestError.message) Return Nothing Else Console.WriteLine("Error encountered while requesting signature from template, please review your envelope and recipient data.") Return Nothing End If Else Console.WriteLine("Signature request has been sent to {0}, envelopeId is {1}.", envelope.Recipients.signers(0).email, envelope.EnvelopeId) Return envelope End If End Function PS - As I've said I am extremely new to this and am learning as I am going. I understand this may not be the most elegant approach or properly formatted code, but I unfortunately have very little time to go back an update code I've written. Hopefully one day I will be able to go back and fix all the stuff I didn't understand when I first created it.