views:

152

answers:

2

Hi,

I'm wanting to copy an already existing Google Docs Spreadsheet to a new Google Docs spreadsheet. I dont think the v2.0 .NET API can handle it natively (or if so I can't find the class/method), however It looks like the v3.0 protocol can but I'm not sure how to implement this in the current framework or even if it is possible with the current .net api. eg. ~DocumentsFeed.copy() (pseudo code).

Exporting to a temp excel file then uploading with a new name is not possible either as some of the complex formulas get messed up in the conversion process.

I am a bit of a .NET noob so any info would be greatly appreciated eg. How would I go about doing this in .NET if I could only use the v3 protocol (ajax etc) and not the .NET API.

Thanks

EDIT: (final class thanks to @langsamu for his help!)

using System;
using Google.GData.Documents;
using Google.GData.Client;
using Google.GData.Extensions;


public class GoogleDocument
{
    private DocumentsService ds;
    private String username;
    private String password;

    public GoogleDocument(String username, String password)
    {
        this.ds = new DocumentsService("doc service name");
        this.username = username;
        this.password = password;

        this.ds.setUserCredentials(username, password);
        this.ds.QueryClientLoginToken();
    }

    public void copyDocument(String oldFileName, String newFileName)
    {
        SpreadsheetQuery query = new Google.GData.Documents.SpreadsheetQuery();
        query.Title = oldFileName;
        query.TitleExact = true;

        DocumentsFeed feed = this.ds.Query(query);
        AtomEntry entry = feed.Entries[0];

        entry.Title.Text = newFileName;

        var feedUri = new Uri(DocumentsListQuery.documentsBaseUri);
        this.ds.Insert(feedUri, entry);
    }
}
A: 

It is a bit unclear if you are developing a web application or a desktop application, so I'll try and cover both (essentially they are very much alike - because...).

If you are developing a web application you won't be able to make a 100% AJAX solution. You will only be able to request URL's on the same domain. To do this you will need to either do the communication server side only, or do it server side and proxy it to your web app through AJAX.

If you are developing a desktop application you'll have to do this stuff aswell. Except the AJAX part.

An example app would be fairly easy - 2-3 hours work to whip up considering the documentation given. With just a little knowledge of HTTP and POST request forming you should be able to make it work.

mbanzon
Hey. Thanks for trying to help but you essentially reworded my question and confirmed it should be possible. I've added some code of where I'm at...I've been stuck on this for almost a week now :/
Josh Stuart
+1  A: 
Google.GData.Documents.DocumentsService service = new Google.GData.Documents.DocumentsService("YOUR_APPLICATIONS_NAME");
service.setUserCredentials("YOUR_USERNAME", "YOUR_PASSWORD");

Google.GData.Documents.SpreadsheetQuery query = new Google.GData.Documents.SpreadsheetQuery();
query.Title = "YOUR_SPREADSHEETS_TITLE";
query.TitleExact = true;

Google.GData.Documents.DocumentsFeed feed = service.Query(query);
Google.GData.Client.AtomEntry entry = feed.Entries[0];

var feedUri = new Uri(Google.GData.Documents.DocumentsListQuery.documentsBaseUri);

service.Insert(feedUri, entry);

This solution is basically about retrieving an existing spreadsheet (service.Query) using the Document List API and re-inserting it (service.Insert).

Make sure you replace the ALL CAPS application name, username, password and spreadsheet title.

Add a reference to Google.GData.Documents.

This is using .NET 4 (should work with lower versions as well) and Google Documents List Data API v2.0 (DLL says version is 1.6.0.0: google-gdata), which seems to use version 3.0 of the protocol.

langsamu
Thanks for this. I'll have a look now that I'm at work.
Josh Stuart
Dude it worked like a charm! I added an extra little bit that changed the name of the new file. Sorry it was just too late for the bounty. But guru nonetheless! (posted my class for anyone else who wanted to use it)
Josh Stuart