Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a new sheet in Google Sheet c#

I am able to retrieve and update values in Google Sheets using the code below:

private void btnUpdate_Click(object sender, EventArgs e)
        {
            if (cbYards.Text == "Select Yard")
            {
                MessageBox.Show(@"Please select a yard.");
                return;
            }
            UserCredential credential;

            using (var stream =
                new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
            {
                string credPath = 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("Credential file saved to: " + credPath);
            }

            var service = new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            IList<IList<Object>> list = new List<IList<Object>>() { };
            for (var i = 0; i < dataGridView1.Rows.Count - 1; i++)
            {
                var formula = "=IFERROR(VLOOKUP(B"+(i+2)+",Names!$A$2:$B,2,FALSE),\"No Record\")";
                List<object> lists = new List<object>() { formula, dataGridView1.Rows[i].Cells[0].Value.ToString(), 
                    dataGridView1.Rows[i].Cells[1].Value.ToString() };
                list.Add(lists);
            }

            var range = cbYards.Text+"!A2:C";
            ValueRange VRange = new ValueRange();
            VRange.Range = range;
            VRange.Values = list;

            //ValueRange response = request.Execute();
            ValueRange valueRange = new ValueRange();
            valueRange.MajorDimension = "COLUMNS"; 

            SpreadsheetsResource.ValuesResource.UpdateRequest upd = service.Spreadsheets.Values.Update(VRange, spreadsheetId, range);
            upd.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;
            UpdateValuesResponse response = upd.Execute();
        }

My question is how can I create a new Sheet in the Google Sheet that I am currently using. I thought that all I need to do is replace the

SpreadsheetsResource.ValuesResource.UpdateRequest upd = service.Spreadsheets.Values.Update(VRange, spreadsheetId, range);

to

SpreadsheetsResource.ValuesResource.UpdateRequest upd = service.Spreadsheets.create();

but apparently it is wrong...

I can't understand how to implement the instructions in the documentation at Method: spreadsheets.create

What does the JSon have do with how I will be coding in C#? Really appreciate the help.

UPDATE I found this here but it is not complete since it is still giving me an error of

Additional information: Object reference not set to an instance of an object.

This is the updated code:

private void button1_Click(object sender, EventArgs e)
        {
            UserCredential credential;

            using (var stream =
                new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
            {
                string credPath = 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("Credential file saved to: " + credPath);
            }

            var service = new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            string sheetName = string.Format("{0} - {1}-{2}", cbYards.Text, fromDate.Value.ToShortDateString(), toDate.Value.ToShortDateString());
            var myNewSheet = new Google.Apis.Sheets.v4.Data.Spreadsheet();
            myNewSheet.Properties = new SpreadsheetProperties();
            myNewSheet.Properties.Title = sheetName;
            var newSheet = service.Spreadsheets.Create(myNewSheet).Execute();
        }
like image 302
Ibanez1408 Avatar asked Jan 03 '17 08:01

Ibanez1408


People also ask

What does Ctrl C do in Google Sheets?

To copy and paste cells: Press Ctrl+C (Windows) or Command+C (Mac) on your keyboard to copy the cells. Select the cell or cells where you want to paste the cells. The copied cells will now have a box around them.

How do I create a custom Google sheet?

Create or open a spreadsheet in Google Sheets. At the top, click Add-ons > Get add-ons. Once the Google Workspace Marketplace opens, click the search box in the top right corner. Type "custom function" and press Enter.

How do I create a new Google sheet in a script?

Using Google app script you can create a new spreadsheet by executing the script. Page open up with Untitled project and my function() as a default function. Double click the “Untitled project displayed at the top left of the page and give a Project name as you wish.

How do I create an existing sheet in Google forms?

There's also a link to Google Forms in Docs, Sheets, and Slides: click File > New > Form to start a new blank form. Or, in Google Sheets, click Tools > Create a Form to start a blank new form that's automatically linked to that spreadsheet.


3 Answers

There is a method in the client library for create you just need to pass it the new sheet object. Don't forget to instantiate the Properties before assigning the title (line 2 below)

var myNewSheet = new Google.Apis.Sheets.v4.Data.Spreadsheet();
myNewSheet.Properties = new SpreadsheetProperties();
myNewSheet.Properties.Title = "Daimtos awsom sheet";
var awsomNewSheet= service.Spreadsheets.Create(myNewSheet).Execute();

Note: I agree with you that documentation page is useless.

like image 76
DaImTo Avatar answered Sep 29 '22 00:09

DaImTo


The reason why you get a null reference is because you can't have a spreadsheet without a sheet in it.

var myNewSheet = new Google.Apis.Sheets.v4.Data.Spreadsheet();
myNewSheet.Properties = new SpreadsheetProperties();
myNewSheet.Properties.Title = sheetName;

var sheet = new Sheet();
sheet.Properties = new SheetProperties();
sheet.Properties.Title = "Sheet1";
myNewSheet.Properties.Sheets = new List<Sheet>() { sheet };

var newSheet = service.Spreadsheets.Create(myNewSheet).Execute();
like image 21
JakobHagg Avatar answered Sep 29 '22 01:09

JakobHagg


The following piece of code is working on my side:

var addSheetRequest = new AddSheetRequest();
addSheetRequest.Properties = new SheetProperties();
addSheetRequest.Properties.Title = sheetName;
BatchUpdateSpreadsheetRequest batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
batchUpdateSpreadsheetRequest.Requests = new List<Request>();
batchUpdateSpreadsheetRequest.Requests.Add(new Request { AddSheet = addSheetRequest });

var batchUpdateRequest = service.Spreadsheets.BatchUpdate(batchUpdateSpreadsheetRequest, SpreadsheetId);
batchUpdateRequest.Execute();
like image 40
krtl Avatar answered Sep 29 '22 00:09

krtl