gspread and oauth2client usage - oauth

I was trying to use oauth2client and gspread to operate on googlesheet but the problem i have is that when using oauth2client, it requires a field of scope. I have no idea what the scope is. The following is the code of the use of oauth2client.
import gspread
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('gspread-april-2cd … ba4.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open("Where is the money Lebowski?").sheet1

The OAuth scopes express the permissions you request users to authorize for your app.
The one you used is the only available scope to authorize your request when using Google Sheets API v3.
https://spreadsheets.google.com/feeds
While if you used the Google Sheets API v4, you can now use either of these two scopes:
https://www.googleapis.com/auth/spreadsheets.readonly
that allows read-only access to the user's sheets and their properties and
https://www.googleapis.com/auth/spreadsheets
that allows read/write access to the user's sheets and their properties.

Related

How can I delete a Google Sheets created by a service account?

I have a python script using gspread to create a Google Sheets using a service user. So the owner of the document is the service user and not me.
How can I easily delete such a document if I am not the onwer but I have the service user details?
The Client object in the gspread library has a del_spreadsheet method. Here's the relevant section of the source code:
class Client:
def del_spreadsheet(self, file_id):
"""Deletes a spreadsheet.
:param str file_id: a spreadsheet ID (a.k.a file ID).
"""
url = "{}/{}".format(DRIVE_FILES_API_V3_URL, file_id)
params = {"supportsAllDrives": True}
self.request("delete", url, params=params)
So you can use your service account credentials to create a Client with ownership of the spreadsheet using gspread.service_account, then call the del_spreadsheet method of the Client. file_id is the unique ID of the spreadsheet, which you can easily pull from the URL bar when the spreadsheet is open, or using the id property of the spreadsheet if you're editing it with gspread.

Get list of Measurements with Influx 2

I'm having trouble understanding how to use some InfluxDB 2 APIs from Python, using the influxdb-client-python library for InfluxDB 2
For example I would like to get a list of measurements in a bucket.
Official documentation (not Python) suggest this:
Use the schema.measurements() function to list measurements in a bucket.
import "influxdata/influxdb/schema"
schema.measurements(bucket: "example-bucket")
I have searched through the library's code to see if I could find something that does this. I might be wrong, but it appears that as of right now there's no interface for this functionality.
However, it is possible to do what you want by executing the following:
from influxdb_client import InfluxDBClient
address = "myaddress"
token = "mytoken"
org = "myorg"
client = InfluxDBClient(url=address, token=token, org=org)
qapi = client.query_api()
q = 'import "influxdata/influxdb/schema"\n\nschema.measurements(bucket: "example-bucket")'
tables = qapi.query(q)
for table in tables:
print(table)
for record in table.records:
print(record.values)
You will have to substitute any defined variables from this code sample with your own. Also, make sure that the bucket name in the query matches the bucket you want to query.
Finally, the token you use must have enough permissions to accomplish the task.

How to setup Service accounts in Dataflow jobs

Need to setup service account in Dataflow program which pull messages from subscribers and do the transformation on data and finally store in BigQuery table.
Approach:
GoogleCredential credentials = GoogleCredential.fromStream(new FileInputStream("credentials.json")).createScoped(Collections.singleton(??));
Couldn't find the correct scope. Appreciate your help with code and invoking Dataflow job using credential setup.
Here is the code to trigger dataflow job from Java API to GCP platform.
Scope code:
final List<String> SCOPES = Arrays.asList(
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/devstorage.full_control",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/datastore",
"https://www.googleapis.com/auth/pubsub");
DataflowpipelineOptions code:
options.setGcpCredential(ServiceAccountCredentials.fromStream(
new FileInputStream("abc.json")).createScoped(SCOPES));
Not sure where you're trying to pull data from, but here's a list of available scopes for Google products https://developers.google.com/identity/protocols/googlescopes

yt:statistics / view count not returned with v2 api

I am not able to get yt:statistics and corresponding view count using youtube v2 api
Search URI:
http://gdata.youtube.com/feeds/api/videos/-/park/competition?orderby=viewCount&max-results=50&v=2&format=5&fields=entry(title,content,media:group,yt:statistics,yt:rating,gd:rating)
When I print the feed and look for statistics, I can not found it. I believe I was able to get it until last week.
I use PYTHON gdata lib to send/receive requests. It looks like for some feeds I am getting statistics. Does it not come for every feed??
Any pointers??
UPDATE: Similar observations for yt:rating.
Is there a minimum guarantee that yy api provides for statistics/rating?
Without a minimum guarantee, does it not become un-reliable?
Have you tried using the YouTube-Analytics API?
Not sure what the equivalent call in the Python library would be - but for example, this url will get the top viewed videos:
https://www.googleapis.com/youtube/analytics/v1/reports
?metrics=views
&dimensions=video
&max-results=10
&sort=-views
&start-index=1
&start-date={first date of interest}
&enddate={last date of interest}
&ids={your channel id}
You should be able to use the same OAuth token that you're using for the YouTube Data API v2.

How can I format a Google Sheets spreadsheet cell with the API?

My application generates a table of data and creates a new spreadsheet document in a user's Google Drive. How can I add formatting (color, font-weight, width, etc.) to individual cells? I can't seem to find any documentation, much less how I could implement this through the google-api-ruby-client.
Most of my findings date back to Google API mailing lists that state it isn't supported.
However, I found that another application accomplishes my desired result. An example of "Smartsheet" exporting a document to Google Drive:
From Smartsheet.com:
And the resulting sheet in my Google Drive:
(Feb 2017) As of Google I/O 2016, developers no longer need to export to Excel nor create a new Sheet w/the desired formatting, so the other answers are now dated. You can now format cells using the Google Sheets API. Here's a short Python example that bolds the 1st row (assuming the file ID is SHEET_ID and SHEETS is the API service endpoint):
DATA = {'requests': [
{'repeatCell': {
'range': {'endRowIndex': 1},
'cell': {'userEnteredFormat': {'textFormat': {'bold': True}}},
'fields': 'userEnteredFormat.textFormat.bold',
}}
]}
SHEETS.spreadsheets().batchUpdate(
spreadsheetId=SHEET_ID, body=DATA).execute()
I also made a developer video on this subject if that helps (see below). BTW, you can do the same in Ruby (see its API quickstart sample) or any other language supported by the Google APIs Client Libraries.
The Sheets API provides features not available in older releases, namely giving developers programmatic access to a Sheet as if you were using the user interface (frozen rows, cell formatting[!], resizing rows/columns, adding pivot tables, creating charts, etc.). If you're new to the API, I've created a few videos with somewhat more "real-world" examples:
Migrating SQL data to a Sheet plus code deep dive post
Formatting text using the Sheets API plus code deep dive post
Generating slides from spreadsheet data plus code deep dive post
To see what else you can do with Google Sheets via its REST API or Google Apps Script, check out my other videos. As you can tell, the Sheets API is primarily for document-oriented functionality as described above, but to perform file-level access such as import/export, copy, move, rename, etc., use the Google Drive API instead.
Smartsheet utilizes the ability of the Google API to import an Excel file. The code is roughly along these lines:
DocsService client = new DocsService(<YOUR APP NAME>);
client.setOAuthCredentials(<OAUTH PARAMETERS>);
DocumentListEntry newEntry = new SpreadsheetEntry();
newEntry.setMediaSource(new MediaByteArraySource(<EXCEL FILE BYTE ARRAY OUTPUT STREAM>, DocumentListEntry.MediaType.XLS.getMimeType()));
newEntry.setTitle(new PlainTextConstruct(<FILE NAME>));
DocumentListEntry insertedEntry = client.insert(new URL("https://docs.google.com/feeds/default/private/full/"), newEntry);
// This is your URL to the new doc
String docUrl = insertedEntry.getDocumentLink().getHref();
We already had the ability to export a Smartsheet to an Excel file with formatting via Apache POI. Adding export to a Google Spreadsheet was quite simple for us to implement and it provided some additional functionality beyond what you could do via the API.
Sorry for the delayed response - just happened across this question.
The APIs only provide access to the data and do not expose any methods to add formatting.
Another option (and the one that ended up using) is to manually create a Google Sheet file, with all of the formatting pre-configured, as a template. Then, instead of creating a new spreadsheet document in the user's Google Drive, copy the template, like so:
var config = require('./config');
var google = require('googleapis');
function createSheetFromTemplate(user, templateFileId, done) {
var oauth2Client = new google.auth.OAuth2(config.google.clientId, config.google.clientSecret);
oauth2Client.setCredentials({
access_token: user.google.token,
refresh_token: user.google.refreshToken,
});
var drive = google.drive({
version: 'v2',
auth: oauth2Client
});
drive.files.copy({
fileId: templateFileId,
resource: {
title: 'New Google Sheet',
parents: [{
id: 'root'
}]
}
}, function(err, response) {
if (err) done(err)
initializeSpreadsheet(response.id, user, done);
});
}
In that code, templateFileId is the file id of your shared template. You can get this fileId from your shared template file in any number of ways, but the quick-and-dirty way is just to copy-and-paste it out of the URL when you share it.
For instance, if the sharing URL is:
https://docs.google.com/spreadsheets/d/1234567890abcdefghijklmnop/edit?usp=sharing
Then the file id is 1234567890abcdefghijklmnop
In my case there is nothing private in the template itself, so I just shared it with 'anyone with the link' configured for 'can view', as described here:
https://support.google.com/drive/answer/2494886
If you need to keep the contents of the template file private, then you'll need to find some way to ensure that the account specified by config.google.clientId has access to it.
Hope that helps!
If, like me, uploading a pre-formatted Excel sheet isn't sufficient, then Google Apps Script looks like it might be the way to go. The Range class specifically lets you manipulate at least some of the formatting you were asking about.
https://developers.google.com/apps-script/reference/spreadsheet/range
setFontColor() and setFontWeight() are there, but I don't know of anything for cell width yet.
Importantly, I have also not yet figured out how to bind a Google Apps Script to the sheet that I'm creating using the Google Drive API SDK (Node/Javascript in my case, Ruby in yours).
https://developers.google.com/apps-script/guides/bound
It's been a while since your question, so I'm betting you've already solved it some other way. I'm also not necessarily suggesting porting everything in your app over to Google Apps Script (although I'm seriously considering it myself...), but if you or some other reader figures out how to bind a Google App Script to a spreadsheet with the google-api-ruby-client, you might be good-to-go.

Resources