<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-1377183911445147227</id><updated>2017-07-18T14:05:59.775-07:00</updated><category term="Apps Script" /><category term="Marketplace" /><category term="Guest Post" /><category term="Drive SDK" /><category term="Administrative APIs" /><category term="Google APIs" /><category term="Google Apps" /><category term="Google Calendar API" /><category term="Gmail APIs" /><category term="Google Docs API" /><category term="Marketplace ISV Guest" /><category term="G Suite" /><category term="oauth" /><category term="Google sheets" /><category term="Admin SDK" /><category term="Developers" /><category term="Android" /><category term="Google Data Protocol" /><category term="Google Drive" /><category term="Google Forms" /><category term="OpenID" /><category term="Google Slides API" /><category term="Google Tasks API" /><category term="python" /><category term="Google Apps Marketplace" /><category term="Google Drive SDK" /><category term="Google Sheets API" /><category term="App Engine" /><category term="Auth" /><category term="Gadgets" /><category term="Gmail" /><category term="Google Sites API" /><category term="Google Spreadsheets API" /><category term="Mobile" /><category term="analytics" /><category term="google docs" /><category term="security" /><category term="Drive" /><category term="Google Contacts API" /><category term="JavaScript" /><category term="billing" /><category term=".NET" /><category term="Directory API" /><category term="Google" /><category term="Google Classroom" /><category term="Google I/O" /><category term="Google Prediction API" /><category term="Google+" /><category term="Sheets API" /><category term="marketing" /><category term="spreadsheets" /><category term="video" /><category term="API" /><category term="APIs" /><category term="Audit" /><category term="Charts" /><category term="Fusion Tables" /><category term="GSuite" /><category term="Google Profiles API" /><category term="Groups" /><category term="ISVs" /><category term="Migration" /><category term="Resellers" /><category term="Staff Picks" /><category term="classroom" /><category term="iOS" /><category term="realtime API" /><category term="tools" /><category term="tutorials" /><category term="webinar" /><category term="#io15" /><category term="#io16" /><category term="AdSense" /><category term="Apps" /><category term="Chrome OS" /><category term="Cloud Storage API" /><category term="Community" /><category term="Design" /><category term="Firebase" /><category term="Forms" /><category term="Freemium" /><category term="Google Cloud Directory" /><category term="Google Talk" /><category term="I" /><category term="Inbox" /><category term="PHP" /><category term="Ruby" /><category term="SaaS" /><category term="decks" /><category term="execution API" /><category term="googlenew" /><category term="java" /><category term="mpstaffpick" /><category term="presentations" /><category term="tool" /><category term="videos" /><title type="text">G Suite Developers Blog</title><subtitle type="html">Information for G Suite Developers</subtitle><link rel="alternate" type="text/html" href="http://gsuite-developers.googleblog.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" /><author><name>Vic Fryzel</name><uri>http://www.blogger.com/profile/01205163862547889372</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>389</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/GoogleAppsDeveloperBlog" /><feedburner:info uri="googleappsdeveloperblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>GoogleAppsDeveloperBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>https://feedburner.google.com</feedburner:feedburnerHostname><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-117093267335285991</id><published>2017-07-18T10:00:00.000-07:00</published><updated>2017-07-18T14:05:59.801-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Auth" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="oauth" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title type="text">New security protections to reduce risk from unverified apps</title><content type="html">&lt;span class="post-author"&gt;Posted by Naveen Agarwal, Identity team and &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We’re constantly working to secure our users and their data. Earlier this year, we detailed some of our &lt;a href="https://security.googleblog.com/2017/02/better-and-more-usable-protection-from.html"&gt;latest anti-phishing tools&lt;/a&gt; and rolled-out &lt;a href="https://developers.googleblog.com/2017/05/updating-developer-identity-guidelines.html"&gt;developer-focused updates&lt;/a&gt; to our app publishing processes, risk assessment systems, and user-facing consent pages. Most recently, we introduced &lt;a href="https://www.blog.google/products/g-suite/manage-access-third-party-apps-new-g-suite-security-controls/"&gt;OAuth apps whitelisting in G Suite&lt;/a&gt; to enable admins to choose exactly which third-party apps can access user data.&lt;br /&gt;&lt;br /&gt;Over the past few months, we’ve required that some &lt;i&gt;new&lt;/i&gt; web applications go through a verification process prior to launch based upon a dynamic risk assessment.&lt;br /&gt;&lt;br /&gt;Today, we’re expanding upon that foundation, and introducing additional protections: bolder warnings to inform users about newly created web apps and Apps Scripts that are pending verification. Additionally, the changes we're making will improve the developer experience. In the coming months, we will begin expanding the verification process and the new warnings to existing apps as well.&lt;br /&gt;&lt;h3&gt;Protecting against unverified apps&amp;nbsp;&lt;/h3&gt;Beginning today, we’re rolling out an “unverified app” screen for newly created web applications and Apps Scripts that require verification. This new screen replaces the “error” page that developers and users of unverified web apps receive today.&lt;br /&gt;&lt;br /&gt;The “unverified app” screen precedes the permissions consent screen for the app and lets potential users know that the app has yet to be verified. This will help reduce the risk of user data being phished by bad actors. &lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-7JrozLO7EU0/WW42BXf6QFI/AAAAAAAABnU/o4o5eUs6mHMJoZdwOMPtub8fbYqD2TrnACLcBGAs/s1600/unverified-app-ui.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="772" data-original-width="556" height="640" src="https://4.bp.blogspot.com/-7JrozLO7EU0/WW42BXf6QFI/AAAAAAAABnU/o4o5eUs6mHMJoZdwOMPtub8fbYqD2TrnACLcBGAs/s640/unverified-app-ui.gif" width="457" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The "unverified app" consent flow&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;This new notice will also help developers test their apps more easily. Since users can choose to acknowledge the ‘unverified app’ alert, developers can now test their applications without having to go through the OAuth client verification process first (see our &lt;a href="https://developers.googleblog.com/2017/05/updating-developer-identity-guidelines.html"&gt;earlier post&lt;/a&gt; for details).&lt;br /&gt;&lt;br /&gt;Developers can follow the steps laid out in &lt;a href="https://support.google.com/cloud/answer/7454865"&gt;this help center article&lt;/a&gt; to begin the verification process to remove the interstitial and prepare your app for launch.&lt;br /&gt;&lt;h3&gt;Extending security protections to Google Apps Script&amp;nbsp;&lt;/h3&gt;We’re also extending these same protections to &lt;a href="https://developers.google.com/apps-script/"&gt;Apps Script&lt;/a&gt;. Beginning this week, new Apps Scripts requesting OAuth access to data from consumers or from users in other domains may also see the "unverified app" screen. For more information about how these changes affect Apps Script developers and users, see the &lt;a href="https://developers.google.com/apps-script/guides/client-verification"&gt;verification documentation page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Apps Script is proactively protecting users from abusive apps in other ways as well. Users will see new cautionary language reminding them to “consider whether you trust” an application before granting OAuth access, as well as a banner identifying web pages and forms created by other users. &lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-ZUxt4ieaQaE/WW40YFoGTYI/AAAAAAAABnM/x_EeyU4XuX4_MnR0c4vShr7Yj-SN_nI5ACLcBGAs/s1600/final%2Bfor%2Bblog.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="1012" data-original-width="1103" height="585" src="https://4.bp.blogspot.com/-ZUxt4ieaQaE/WW40YFoGTYI/AAAAAAAABnM/x_EeyU4XuX4_MnR0c4vShr7Yj-SN_nI5ACLcBGAs/s640/final%2Bfor%2Bblog.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Updated Apps Script pre-OAuth alert with cautionary language&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-u1jHdeG832E/WW40ziVlypI/AAAAAAAABnQ/GV1DBJL-1soTKW9Uw83CUazsDk2hEsU-QCLcBGAs/s1600/ugc_banner.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" data-original-height="439" data-original-width="898" height="312" src="https://4.bp.blogspot.com/-u1jHdeG832E/WW40ziVlypI/AAAAAAAABnQ/GV1DBJL-1soTKW9Uw83CUazsDk2hEsU-QCLcBGAs/s640/ugc_banner.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Apps Script user-generated content banner&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;h3&gt;Extending protections to existing apps&amp;nbsp;&lt;/h3&gt;In the coming months, we will continue to enhance user protections by extending the verification process beyond newly created apps, to existing apps as well. As a part of this expansion, developers of some current apps may be required to go through the verification flow.&lt;br /&gt;&lt;br /&gt;To help ensure a smooth transition, we recommend developers verify that their contact information is up-to-date. In the &lt;a href="https://console.developers.google.com/"&gt;Google Cloud Console&lt;/a&gt;, developers should ensure that the appropriate and monitored accounts are granted either the project owner or billing account admin IAM role. For help with granting IAM roles, see &lt;a href="https://cloud.google.com/iam/docs/granting-changing-revoking-access"&gt;this help center article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the API manager, developers should ensure that their OAuth consent screen configuration is accurate and up-to-date. For help with configuring the consent screen, see &lt;a href="https://support.google.com/cloud/answer/6158849?hl=en#userconsent"&gt;this help center article&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;We’re committed to fostering a healthy ecosystem for both users and developers. These new notices will inform users automatically if they may be at risk, enabling them to make informed decisions to keep their information safe, and will make it easier to test and develop apps for developers.  &lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/5ctaAQBYAF4" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/117093267335285991" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/117093267335285991" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/5ctaAQBYAF4/new-security-protections-to-reduce-risk.html" title="New security protections to reduce risk from unverified apps" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-7JrozLO7EU0/WW42BXf6QFI/AAAAAAAABnU/o4o5eUs6mHMJoZdwOMPtub8fbYqD2TrnACLcBGAs/s72-c/unverified-app-ui.gif" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/07/new-security-protections-to-reduce-risk.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-6357351484342980941</id><published>2017-07-12T10:00:00.000-07:00</published><updated>2017-07-12T10:01:43.863-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Admin SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Administrative APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Audit" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive SDK" /><title type="text">Identifying app usage in your Google Drive audit logs</title><content type="html">&lt;span class="post-author"&gt;Posted by Rio Akasaka, Product Manager, Google Drive and &lt;a href="https://plus.google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you’re a G Suite admin (or a developer creating apps for admins), it’s important to understand the various applications your company’s employees are using and how they’re accessing them. Today, we’re making that easier by introducing app identification (i.e.&amp;nbsp;&lt;span style="font-family: &amp;quot;consolas&amp;quot;; font-size: 11pt; white-space: pre-wrap;"&gt;originating_app_id&lt;/span&gt;) in the Google Drive audit logs within the Admin SDK &lt;a href="https://developers.google.com/admin-sdk/reports/v1/reference/activity-ref-appendix-a/drive-event-names"&gt;Reports API&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, your apps will be able to determine whether an activity logged was performed by a user in the Drive Android app, Drive iOS app, Google Chrome, or through a variety of other third-party apps that leverage, modify or create files within Google Drive, like Smartsheet or Asana. This will give you a better sense of the apps being used in your organization, as well as the extent and context of that usage.&lt;br /&gt;&lt;br /&gt;Note that App IDs that show up in the logs will be numeric. Should you want to retrieve app names, a separate request using the &lt;a href="https://developers.google.com/drive/v2/reference/apps/get"&gt;Google Drive REST API&lt;/a&gt; is needed.  If you already retrieve information through the &lt;a href="https://developers.google.com/admin-sdk/reports/v1/guides/manage-audit-drive"&gt;Drive activity request&lt;/a&gt;, you should start seeing the&amp;nbsp;&lt;span id="docs-internal-guid-3b2cd8b4-33bc-82ba-a53f-16159f71d8a0"&gt;&lt;span style="font-family: &amp;quot;consolas&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;originating_app_id&lt;/span&gt;&lt;/span&gt;s show up in your logs. Here are a pair of HTTP requests you can use to query this information:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;GET &lt;br /&gt;https://www.googleapis.com/admin/reports/v1/activity/users/userKey&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Or&lt;br /&gt;&lt;pre&gt;&lt;code&gt;GET &lt;br /&gt;https://www.googleapis.com/admin/reports/v1/activity/users/all/applications/drive&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;To learn more about this new feature, take a look at the &lt;a href="https://developers.google.com/admin-sdk/reports/v1/reference/activity-ref-appendix-a/drive-event-names"&gt;documentation&lt;/a&gt;, then integrate into your code so you and other G Suite admins can gain a better understanding of app usage in your domain(s). We look forward to seeing what you build!&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/pBWCEZG8YUU" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6357351484342980941" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6357351484342980941" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/pBWCEZG8YUU/identifying-app-usage-in-your-google.html" title="Identifying app usage in your Google Drive audit logs" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/07/identifying-app-usage-in-your-google.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-6670506601683060692</id><published>2017-07-05T14:00:00.000-07:00</published><updated>2017-07-05T14:00:13.539-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><title type="text">Google People API now supports updates to Contacts and Contact Groups</title><content type="html">&lt;span class="post-author"&gt;Posted by Amos Yuen, Software Engineer, and &lt;a href="https://plus.google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;span class="post-author"&gt;&lt;br /&gt;&lt;/span&gt;Starting today, the &lt;a href="https://developers.google.com/people/"&gt;Google People API&lt;/a&gt; will get new endpoints for contacts and contact groups. Last year, we &lt;a href="https://developers.googleblog.com/2016/02/announcing-people-api.html"&gt;launched&lt;/a&gt; the Google People API with read-only endpoints with plans to eventually replace the old &lt;a href="https://developers.google.com/google-apps/contacts/v3/"&gt;Contacts API&lt;/a&gt;. We’re one step closer to that goal by adding write endpoints that allow developers to create, delete and update a single contact. In addition, there are new contact group endpoints that allow developers to read and write contact groups.&lt;br /&gt;&lt;br /&gt;Applications need to be authorized to access the API so to get started, you will need to create a project on the &lt;a href="https://console.developers.google.com/"&gt;Google Developers Console&lt;/a&gt; with the People API enabled to get access to the service. All of the steps to do so are &lt;a href="https://developers.google.com/people/v1/getting-started"&gt;here&lt;/a&gt;. If you’re new to the Google APIs and/or the Developers Console,  &lt;a href="https://www.youtube.com/watch?v=DYAwYxVs2TI&amp;amp;feature=youtu.be&amp;amp;list=PLOU2XLYxmsILOIxBRPPhgYbuSslr50KVq&amp;amp;index=2"&gt;check out this video&lt;/a&gt;, the first in a series of videos to help you get up-to-speed. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-3vOxWUGnevU/WV0wDV31LKI/AAAAAAAABms/3N5N5L1UQbUA1Ho1QRcflXhdrFDoKCkjwCLcBGAs/s1600/image1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1493" data-original-width="1600" height="595" src="https://1.bp.blogspot.com/-3vOxWUGnevU/WV0wDV31LKI/AAAAAAAABms/3N5N5L1UQbUA1Ho1QRcflXhdrFDoKCkjwCLcBGAs/s640/image1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once you’re authorized, you can simply create new contacts like this (&lt;a href="https://developers.google.com/api-client-library/java/"&gt;using the Google APIs Client Library for Java&lt;/a&gt;):&lt;br /&gt;&lt;pre&gt;&lt;code&gt;Person contactToCreate = new Person();&lt;br /&gt;&lt;br /&gt;List&lt;name&gt; names = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;names.add(new Name().setGivenName("John").setFamilyName("Doe"));&lt;br /&gt;contactToCreate.setNames(names);&lt;br /&gt;&lt;br /&gt;Person createdContact =&lt;br /&gt;    peopleService.people().createContact(contactToCreate).execute();&lt;/name&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The scope your app needs to authorize with is  &lt;a href="https://www.googleapis.com/auth/contacts"&gt;https://www.googleapis.com/auth/contacts&lt;/a&gt;. Full documentation on the&amp;nbsp;&lt;span id="docs-internal-guid-22eca898-1408-52be-654e-2f3b44e4148e"&gt;&lt;span style="color: #006600; font-family: &amp;quot;consolas&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;people.create&lt;/span&gt;&lt;/span&gt;&amp;nbsp;method is available &lt;a href="https://developers.google.com/people/api/rest/v1/people/createContact"&gt;here&lt;/a&gt;.  You can update an existing contact like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;String resourceName = "people/c12345"; // existing contact resource name&lt;br /&gt;Person contactToUpdate = peopleService.people().get(resourceName)&lt;br /&gt;    .setPersonFields("names,emailAddresses")&lt;br /&gt;    .execute();&lt;br /&gt;&lt;br /&gt;List&lt;emailaddress&gt; emailAddresses = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;emailAddresses.add(new EmailAddress().setValue("john.doe@gmail.com"));&lt;br /&gt;contactToUpdate.setEmailAddresses(emailAddresses);&lt;br /&gt;&lt;br /&gt;Person updatedContact = peopleService.people().updateContact(contactToUpdate)&lt;br /&gt;    .setUpdatePersonFields("emailAddresses")&lt;br /&gt;    .execute();&lt;/emailaddress&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Full documentation on the&amp;nbsp;&lt;span id="docs-internal-guid-22eca898-1409-f25f-fde3-69f2605a4932"&gt;&lt;span style="background-color: #fafafa; color: #006600; font-family: &amp;quot;consolas&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;people.update&lt;/span&gt;&lt;span style="font-family: &amp;quot;roboto&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt; &lt;/span&gt;&lt;/span&gt;&amp;nbsp;method is available &lt;a href="https://developers.google.com/people/api/rest/v1/people/createContact"&gt;here&lt;/a&gt;.  We look forward to seeing what you can do with these new features allowing you to modify contacts. To learn more about the People API, check out the official documentation &lt;a href="https://developers.google.com/people/"&gt;here&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/JfNLXHCFIUg" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6670506601683060692" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6670506601683060692" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/JfNLXHCFIUg/google-people-api-now-supports-updates.html" title="Google People API now supports updates to Contacts and Contact Groups" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-3vOxWUGnevU/WV0wDV31LKI/AAAAAAAABms/3N5N5L1UQbUA1Ho1QRcflXhdrFDoKCkjwCLcBGAs/s72-c/image1.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/07/google-people-api-now-supports-updates.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-9194152692384096158</id><published>2017-06-29T10:00:00.000-07:00</published><updated>2017-06-29T10:26:31.698-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Gmail" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Calendar API" /><category scheme="http://www.blogger.com/atom/ns#" term="video" /><title type="text">Modifying events with the Google Calendar API</title><content type="html">&lt;span class="post-author"&gt;Posted by &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;span class="post-author"&gt;&lt;br /&gt;&lt;/span&gt;You might be using the &lt;a href="https://developers.google.com/google-apps/calendar/"&gt;Google Calendar API&lt;/a&gt;, or alternatively &lt;a href="https://www.youtube.com/watch?v=7uQ87m9RB74&amp;amp;index=6&amp;amp;list=PLOU2XLYxmsILOIxBRPPhgYbuSslr50KVq"&gt;email markup&lt;/a&gt;, to insert events into your users’ calendars. Thankfully, these tools allow your apps to do this seamlessly and automatically, which saves your users a lot of time. But what happens if plans change? You need your apps to also be able to modify an event.&lt;br /&gt;&lt;br /&gt;While email markup does support this update, it’s limited in what it can do, so in today’s video, we’ll show you how to modify events with the Calendar API. We’ll also show you how to create repeating events. Check it out:&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/Qd64idiKZWw?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ" width="640"&gt;&lt;/iframe&gt; Imagine a potential customer being interested in your product, so you set up one or two meetings with them. As their interest grows, they request regularly-scheduled syncs as your product makes their short list—your CRM should be able to make these adjustments in your calendar without much work on your part. Similarly, a “dinner with friends” event can go from a “rain check” to a bi-monthly dining experience with friends you’ve grown closer to. Both of these events can be updated with a JSON request payload like what you see below to adjust the date and make it repeating:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;var TIMEZONE = "America/Los_Angeles";&lt;br /&gt;var EVENT = {&lt;br /&gt;    "start": {"dateTime": "2017-07-01T19:00:00", "timeZone": TIMEZONE},&lt;br /&gt;    "end":   {"dateTime": "2017-07-01T22:00:00", "timeZone": TIMEZONE},&lt;br /&gt;    "recurrence": ["RRULE:FREQ=MONTHLY;INTERVAL=2;UNTIL=20171231"]&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This event can then be updated with a single call to the Calendar API’s events().patch() method, which in Python would look like the following given the request data above, GCAL as the API service endpoint, and a valid EVENT_ID to update:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;GCAL.events().patch(calendarId='primary', eventId=EVENT_ID,&lt;br /&gt;    sendNotifications=True, body=EVENT).execute()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;If you missed it, &lt;a href="https://www.youtube.com/watch?v=tNo9IoZMelI"&gt;check out this video&lt;/a&gt; that shows how you can insert events into Google Calendar as well as the &lt;a href="https://developers.google.com/google-apps/calendar/"&gt;official API documentation&lt;/a&gt;. Also, if you have a Google Apps Script app, you can programmatically access Google Calendar with its &lt;a href="http://developers.google.com/apps-script/reference/calendar"&gt;Calendar service&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We hope you can use this information to enhance your apps to give your users an even better and timely experience.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/RMux5_IJMJ8" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/9194152692384096158" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/9194152692384096158" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/RMux5_IJMJ8/modifying-events-with-google-calendar.html" title="Modifying events with the Google Calendar API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/Qd64idiKZWw/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/06/modifying-events-with-google-calendar.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-7757394259878933023</id><published>2017-06-07T12:00:00.000-07:00</published><updated>2017-06-07T12:08:11.905-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Drive SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><title type="text">VIDEO: Part 1—Introducing Team Drives for developers</title><content type="html">&lt;span class="post-author"&gt;Posted by Hodie Meyers, Product Manager, Google Drive, and &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enterprises are always looking for ways to operate more efficiently, and equipping developers with the right tools can make a difference. &lt;a href="https://blog.google/products/g-suite/introducing-new-enterprise-ready-tools-google-drive/"&gt;We launched Team Drives&lt;/a&gt; this year to bring the best of what users love about Drive to enterprise teams. We also updated the Google Drive API, so that developers can leverage Team Drives in the apps they build.&lt;br /&gt;&lt;br /&gt;In this latest G Suite Dev Show video, we cover how you can leverage the functionality of Team Drives in your apps. The good news is you don’t have to learn a completely new API—Team Drives features are built into the Drive API so you can build on what you already know. Check it out:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/5bifEBJRlaQ?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;By the end of this video, you‘ll be familiar with four basic operations to help you build Team Drives functionality right in your apps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;How to create Team Drives&amp;nbsp;&lt;/li&gt;&lt;li&gt;How to add members/users to your Team Drives&amp;nbsp;&lt;/li&gt;&lt;li&gt;How to create folders in Team Drives (just like creating a regular Drive folder)&amp;nbsp;&lt;/li&gt;&lt;li&gt;How to upload/import files to Team Drives folders (just like uploading files to regular folders)&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;The Drive API can help a variety of developers create solutions that work with both Google Drive and Team Drives. Whether you’re an Independent Software Vendor (ISV), System Integrator (SI) or work in IT, there are many ways to use the Drive API to enhance productivity, help your company migrate to G Suite, or build tools to automate workflows.&lt;br /&gt;&lt;br /&gt;Team Drives features are available in both Drive API v2 and v3, and more details can be found in the &lt;a href="http://developers.google.com/drive"&gt;Drive API documentation&lt;/a&gt;. We look forward to seeing what you build with Team Drives!&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/tzIAjwktabU" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7757394259878933023" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7757394259878933023" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/tzIAjwktabU/video-part-1introducing-team-drives-for.html" title="VIDEO: Part 1—Introducing Team Drives for developers" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/5bifEBJRlaQ/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/06/video-part-1introducing-team-drives-for.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-2666608550290594973</id><published>2017-06-01T10:00:00.000-07:00</published><updated>2017-06-01T10:13:30.886-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apps Script" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive" /><category scheme="http://www.blogger.com/atom/ns#" term="Google sheets" /><title type="text">Google I/O session recap: how to build custom apps with App Maker</title><content type="html">&lt;span class="post-author"&gt;Posted by Geva Rechav, Product Manager, App Maker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Every company has workflows and processes that are unique to its business, customers and employees. Often, these are captured manually within large spreadsheets or ad-hoc databases with macros and scripts. But what if they could be turned into custom business apps instead? Apps that provide useful UIs and distinct user roles, while helping to minimize data entry errors and increase productivity?&lt;br /&gt;&lt;br /&gt;This year at &lt;a href="https://events.google.com/io/"&gt;Google I/O&lt;/a&gt;, I shared reasons why businesses should use &lt;a href="https://www.blog.google/products/g-suite/customize-your-g-suite-experience-app-maker-and-recommended-apps/"&gt;App Maker&lt;/a&gt;—our low-code, application development tool that lets companies quickly build custom apps in G Suite. Check it out here:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/Q84HQgI3Dd8" width="640"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;And for those who’d like more detail, here is a recap of my presentation.&lt;br /&gt;&lt;h3&gt;Closing enterprise “app gaps” with App Maker&amp;nbsp;&lt;/h3&gt;“App gaps” are a reality for most companies, even those that embrace major SaaS products. Think about the edge cases that aren’t addressed with a standard CRM offering like conducting territory planning or tracking asset performance.&lt;br /&gt;&lt;br /&gt;We experienced similar gaps at Google. A few years ago, our HR recruiters were overwhelmed with the thousands of monthly interviews that each generated lengthy feedback reports from multiple interviewers. This volume made it difficult for hiring committees to calibrate candidates and make timely decisions, and resulted in delayed responses. To fix this, our IT team decided to build an app by cobbling elements from our own infrastructure.&lt;br /&gt;&lt;br /&gt;Over time, more app requests came in from other parts of Google, so we created App Maker. What started as a handful of apps within Google, evolved into nearly 400 internal apps used by thousands. Plus, the majority of these apps were built by non-engineers outside of IT.&lt;br /&gt;&lt;br /&gt;Today, App Maker gives software engineers and citizen developers—like business analysts or coding enthusiasts—the ability to quickly build and deploy apps to get around their workflow challenges.&lt;br /&gt;&lt;h3&gt;How does it work?&amp;nbsp;&lt;/h3&gt;App Maker makes it easy to build apps in days, not months, because of its easy data-binding and drag-and-drop UI design. You can also integrate your apps with various data sources,  Google services or APIs to cover broad legacy assets. Any app you create is also a part of Drive in G Suite so your data never leaves your domain.&lt;br /&gt;&lt;br /&gt;Here’s how to build an App Maker app in three steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Define your &lt;b&gt;data &lt;/b&gt;models, by importing existing Google Sheets to App Maker, connecting to Google Cloud SQL instances, or manually defining custom objects field by field.&lt;/li&gt;&lt;li&gt;Build your &lt;b&gt;UI &lt;/b&gt;by adding pre-built components like data entry forms, report templates and easily create event triggers and application flows.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Optionally, add open source HTML, CSS and JavaScript to run on the client UI and on the app server, implementing &lt;b&gt;custom functionality&lt;/b&gt; that’s not provided out-of-the-box.&lt;/li&gt;&lt;/ol&gt;App Maker is currently in Early Adopter Program (EAP) for every G Suite Business customer. To get started, &lt;a href="https://gsuite.google.com/campaigns/index__appmakereap.html"&gt;apply here&lt;/a&gt;.&lt;br /&gt;&lt;h3&gt;Ideas to get started&amp;nbsp;&lt;/h3&gt;By now you’re probably wondering what you can build. Well, based on our customers’ experience, here are some good starting points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;If you have a large Sheet with more than a handful of users updating it regularly:&lt;/b&gt; Sheets usually have an underlying workflow. An App Maker app will provide a better UI for it—showing the workflow visually, prompting for actions and eliminating data entry errors.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;If you perform recurring bulk operations in Calendar or Gmail:&lt;/b&gt; Say an employee joins or leaves a department, you can build an App Maker app to generate the appropriate bulk-operations in a few clicks.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;If your company is already using &lt;a href="https://developers.google.com/apps-script/advanced/bigquery"&gt;Apps Script and BigQuery&lt;/a&gt;: &lt;/b&gt;This means you’ve already invested in customizing workflows. App Maker can increase the velocity of developing custom apps.&lt;/li&gt;&lt;/ul&gt;Go build your apps with App Maker in G Suite—&lt;a href="https://gsuite.google.com/campaigns/index__appmakereap.html"&gt;sign up for the EAP today&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/Ci5VzR90sRg" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/2666608550290594973" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/2666608550290594973" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/Ci5VzR90sRg/google-io-session-recap-how-to-build.html" title="Google I/O session recap: how to build custom apps with App Maker" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/Q84HQgI3Dd8/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/06/google-io-session-recap-how-to-build.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-6643859007677182704</id><published>2017-05-11T12:00:00.000-07:00</published><updated>2017-05-15T13:44:58.730-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Auth" /><category scheme="http://www.blogger.com/atom/ns#" term="Gmail APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Contacts API" /><category scheme="http://www.blogger.com/atom/ns#" term="oauth" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title type="text">Updating developer identity guidelines and registration processes to protect users</title><content type="html">&lt;span class="post-author"&gt;Posted by Naveen Agarwal, Identity Team&lt;/span&gt;&lt;br /&gt;&lt;span class="post-author"&gt;(x-posted from&amp;nbsp;&lt;a href="https://developers.googleblog.com/"&gt;Google Developers&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last week, we took &lt;a href="https://security.googleblog.com/2017/05/protecting-you-against-phishing.html"&gt;immediate action&lt;/a&gt; to protect users from a phishing attack that attempted to abuse the OAuth authorization infrastructure.&lt;br /&gt;&lt;br /&gt;Today, we’re supplementing those efforts to help prevent these types of issues in the future. These changes may add some friction and require more time before you are able to publish your web application, so we recommend that you plan your work accordingly.&lt;br /&gt;&lt;h3&gt;Updating app identity guidelines&amp;nbsp;&lt;/h3&gt;As our &lt;a href="https://developers.google.com/terms/api-services-user-data-policy"&gt;Google API user data policy&lt;/a&gt; states, apps must not mislead users. For example, app names should be unique to your application and should not copy others'.&lt;br /&gt;&lt;br /&gt;To further enforce this policy, we are updating our app publishing process, our risk assessment systems, and our user-facing consent page in order to better detect spoofed or misleading application identities. You may see an error message as you’re registering new applications or modifying existing application attributes in the Google API Console, Firebase Console, or Apps Script editor as a result of this change.&lt;br /&gt;&lt;h3&gt;New review processes and restrictions on web apps requesting user data&amp;nbsp;&lt;/h3&gt;We have also enhanced our risk assessment for new web applications that request user data.&lt;br /&gt;&lt;br /&gt;Based on this risk assessment, some web applications will require a manual review. Until the review is complete, users will not be able to approve the data permissions, and we will display an error message instead of the permissions consent page. You can request a review during the testing phase in order to open the app to the public. We will try to process those reviews in 3-7 business days. In the future, we will enable review requests during the registration phase as well.&lt;br /&gt;&lt;br /&gt;You can continue to use your app for testing purposes before it is approved by logging in with an account registered as an owner/editor of that project in the Google API Console. This will enable you to add additional testers, as well as initiate the review process.&lt;br /&gt;&lt;br /&gt;We also recommend developers review &lt;a href="https://gsuite-developers.googleblog.com/2016/09/setting-expectations-for-accessing-user-data-via-oauth.html"&gt;our earlier post&lt;/a&gt; outlining their responsibilities when requesting access to user data from their applications. Our teams will continue our constant efforts to support a powerful, useful developer ecosystem that keeps users and their data safe.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/q_O39C2pDMY" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6643859007677182704" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6643859007677182704" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/q_O39C2pDMY/updating-developer-identity-guidelines.html" title="Updating developer identity guidelines and registration processes to protect users" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/05/updating-developer-identity-guidelines.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-101274854852449084</id><published>2017-04-27T10:00:00.000-07:00</published><updated>2017-04-27T10:10:51.732-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Forms" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Forms" /><title type="text">Create quizzes in Google Forms with Apps Script</title><content type="html">&lt;span class="post-author"&gt;Posted by Tynia Yang, Software Engineer, Google Forms&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last year, &lt;a href="https://blog.google/products/docs/give-feedback-faster-with-quizzes-in/"&gt;we launched Quizzes in Google Forms&lt;/a&gt; to help teachers and students take assessment to scale. Using Quizzes, teachers are able to automate testing and give feedback to students faster by having Forms check responses against correct answers automatically. Today, we are making that functionality available to developers by extending the &lt;a href="https://developers.google.com/apps-script/reference/forms/"&gt;Google Apps Script Forms Service&lt;/a&gt;. With this feature, you can create and customize &lt;a href="https://support.google.com/docs/answer/7032287"&gt;quizzes&lt;/a&gt; programmatically with Apps Script.&lt;br /&gt;&lt;br /&gt;More specifically:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create quizzes&amp;nbsp;&lt;/li&gt;&lt;li&gt;Assign point values and correct answers for questions&amp;nbsp;&lt;/li&gt;&lt;li&gt;Implement custom grading schemes&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Let’s take a look at an example use case and relevant code snippet.&lt;br /&gt;&lt;h3&gt;Creating an auto-graded question&amp;nbsp;&lt;/h3&gt;Multiple choice, checkbox and dropdown questions can be auto-graded, which means students can see their grades immediately upon submission. This is done by designating which options are the correct answer. Teachers can also set automatic feedback to show correct or incorrect responses, as well as assign point values to the question. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-M6Xu9gIlhXA/WP7mNwioYUI/AAAAAAAABmI/fe-5zrzxmikugRNjsSMNv_z1L0KSi0NFQCLcB/s1600/Image%2B1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="375" src="https://2.bp.blogspot.com/-M6Xu9gIlhXA/WP7mNwioYUI/AAAAAAAABmI/fe-5zrzxmikugRNjsSMNv_z1L0KSi0NFQCLcB/s400/Image%2B1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here is the Apps Script code that lets you create the quiz above:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;function createGradedCheckboxQuestionWithAutofeedback() {&lt;br /&gt;  // Make sure the form is a quiz.&lt;br /&gt;  var form = FormApp.getActiveForm();&lt;br /&gt;  form.setIsQuiz(true);&lt;br /&gt;&lt;br /&gt;  // Make a 10 point question and set feedback on it&lt;br /&gt;  var item = FormApp.getActiveForm().addCheckboxItem();&lt;br /&gt;  item.setTitle("What flavors are in neapolitan ice cream?");&lt;br /&gt;  item.setPoints(10);&lt;br /&gt;  // chocolate, vanilla, and strawberry are the correct answers&lt;br /&gt;  item.setChoices([&lt;br /&gt;    item.createChoice("chocolate", true),&lt;br /&gt;    item.createChoice("vanilla", true),&lt;br /&gt;    item.createChoice("rum raisin", false),&lt;br /&gt;    item.createChoice("strawberry", true),&lt;br /&gt;    item.createChoice("mint", false)&lt;br /&gt;  ]);&lt;br /&gt;  // If the respondent answers correctly, they'll see this feedback when they view &lt;br /&gt;  //scores.&lt;br /&gt;  var correctFeedback = FormApp.createFeedback()&lt;br /&gt;      .setText("You're an ice cream expert!")&lt;br /&gt;      .build();&lt;br /&gt;  item.setFeedbackForCorrect(correctFeedback);&lt;br /&gt;  &lt;br /&gt;  // If they respond incorrectly, they'll see this feedback with helpful links to &lt;br /&gt;  //read more about ice cream.&lt;br /&gt;  var incorrectFeedback = FormApp.createFeedback()&lt;br /&gt;      .setText("Sorry, wrong answer")&lt;br /&gt;      .addLink(&lt;br /&gt;        "https://en.wikipedia.org/wiki/Neapolitan_ice_cream",&lt;br /&gt;        "Read more")&lt;br /&gt;      .build();&lt;br /&gt;  item.setFeedbackForIncorrect(incorrectFeedback);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;For more details on what you can build with the Apps Script Forms Service, review the &lt;a href="https://developers.google.com/apps-script/reference/forms/"&gt;documentation&lt;/a&gt;, ask questions on &lt;a href="http://stackoverflow.com/questions/tagged/google-apps-script"&gt;Stack Overflow&lt;/a&gt; or in the &lt;a href="https://plus.google.com/communities/102471985047225101769"&gt;G+ community&lt;/a&gt;, and &lt;a href="https://b.corp.google.com/issues/new?component=191640&amp;amp;template=824113"&gt;let us know&lt;/a&gt; what else you’d like to see using the &lt;a href="https://gsuite-developers.googleblog.com/2017/03/a-new-issue-tracker-for-g-suite.html"&gt;new&lt;/a&gt; public &lt;a href="https://b.corp.google.com/savedsearches/566222"&gt;issue tracker for Apps Script&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/QwdxOzd2NyA" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/101274854852449084" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/101274854852449084" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/QwdxOzd2NyA/create-quizzes-in-google-forms-with.html" title="Create quizzes in Google Forms with Apps Script" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-M6Xu9gIlhXA/WP7mNwioYUI/AAAAAAAABmI/fe-5zrzxmikugRNjsSMNv_z1L0KSi0NFQCLcB/s72-c/Image%2B1.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/04/create-quizzes-in-google-forms-with.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-7271998960852808352</id><published>2017-04-20T13:30:00.000-07:00</published><updated>2017-04-20T13:30:38.447-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Sheets API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Slides API" /><title type="text">Using field masks with update requests to Google APIs</title><content type="html">&lt;span class="post-author"&gt;Posted by &lt;a href="https://plus.google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://gsuite-developers.googleblog.com/2017/03/using-field-masks-with-google-apis-for_31.html"&gt;We recently demonstrated how to use field masks&lt;/a&gt; to limit the amount of data that comes back via response payloads from read (GET) calls to Google APIs. Today, we’ll focus on a different use case for field masks: update requests.&lt;br /&gt;&lt;br /&gt;In this scenario, field masks serve a different, but similar purpose—they still filter, but function more like bitmasks by controlling which API fields to update. The following video walks through several examples of update field mask usage with both the Google Sheets and Slides APIs. Check it out.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/W421BNZA_74/0.jpg" frameborder="0" height="360" src="https://www.youtube.com/embed/W421BNZA_74?feature=player_embedded" width="640"&gt;&lt;/iframe&gt;2&lt;/div&gt;&lt;a href="https://www.blogger.com/"&gt;&lt;/a&gt; In the sample JSON payload below, note the request to set the cells' bold attribute to true (per the&amp;nbsp;&lt;span style="font-family: &amp;quot;roboto mono&amp;quot;; font-size: 14.6667px; white-space: pre-wrap;"&gt;cell&lt;/span&gt;&amp;nbsp;directive below), then notice that the field mask&amp;nbsp;&lt;span style="font-family: &amp;quot;roboto&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;(&lt;/span&gt;&lt;span style="font-family: &amp;quot;roboto mono&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;fields&lt;/span&gt;&lt;span style="font-family: &amp;quot;roboto&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;) &lt;/span&gt;practically mirrors the request:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;{&lt;br /&gt;    "repeatCell": {&lt;br /&gt;        "range": {&lt;br /&gt;            "endRowIndex": 1&lt;br /&gt;        },&lt;br /&gt;        "cell": {&lt;br /&gt;            "userEnteredFormat": {&lt;br /&gt;                "textFormat": {&lt;br /&gt;                    "bold": true&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        },&lt;br /&gt;        "fields": "userEnteredFormat/textFormat/bold",&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Now, you might think, “is that redundant?” Above, we highlighted that it takes two parts: 1) the request provides the data for the desired changes, and 2) the field mask states what should be updated, such as the&amp;nbsp;&lt;span id="docs-internal-guid-115fe904-8cc1-9ce1-d1ca-d40dfb494963"&gt;&lt;span style="font-family: &amp;quot;consolas&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;userEnteredFormat/textFormat/bold&lt;/span&gt;&lt;/span&gt;&amp;nbsp;attribute for all the cells in the first row. To more clearly illustrate this, let’s add something else to the mask like italics. Here, the updated field mask now has both bold and italic fields: &lt;br /&gt;&lt;pre&gt;&lt;code&gt;"fields": &lt;b&gt;"userEnteredFormat/textFormat(bold,italic)"&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;However, while both elements are in the field mask, we’ve only provided the update data for bold. There’s no data for&amp;nbsp;&lt;span id="docs-internal-guid-115fe904-8ccd-1412-ec09-1e4d2cba000f"&gt;&lt;span style="font-family: &amp;quot;consolas&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;italic&lt;/span&gt;&lt;/span&gt;&amp;nbsp;setting specified in the request body. In this case, for all cells will be reset, meaning if the cells were originally italicized, those italics will be removed after this API request completes. And vice versa, if the cells were not italicized to begin with, they’ll stay that way. This feature gives developers the ability to undo or reset any prior settings on affected range of cells. Check out the video for more examples and tips for using field masks for update requests.&lt;br /&gt;&lt;br /&gt;To learn more about using field masks for partial response in API payloads, &lt;a href="https://www.youtube.com/watch?v=T1FUDXRB7Ns"&gt;check out this video&lt;/a&gt; and the first &lt;a href="https://gsuite-developers.googleblog.com/2017/03/using-field-masks-with-google-apis-for_31.html"&gt;post&lt;/a&gt; in this two-part series. For one of the most comprehensive write-ups on both (read and update) use cases, &lt;a href="https://developers.google.com/slides/how-tos/field-masks"&gt;see the guide&lt;/a&gt; in the Google Slides API documentation. &amp;nbsp;Happy field-masking!&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/umgs-1DxRVs" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7271998960852808352" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7271998960852808352" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/umgs-1DxRVs/using-field-masks-with-update-requests.html" title="Using field masks with update requests to Google APIs" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/W421BNZA_74/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/04/using-field-masks-with-update-requests.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-742817980743507158</id><published>2017-04-13T12:00:00.000-07:00</published><updated>2017-04-13T12:20:23.096-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apps Script" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Sheets API" /><category scheme="http://www.blogger.com/atom/ns#" term="I" /><title type="text">Using Google Sheets filters in Add-ons with Google Apps Script</title><content type="html">&lt;span class="post-author"&gt;Posted by &lt;a href="https://plus.google.com/+BruceMcpherson"&gt;Bruce Mcpherson&lt;/a&gt; and &lt;a href="https://plus.google.com/+RomainVialard-public"&gt;Romain Vialard&lt;/a&gt;, Google Developers Experts, and posted by &lt;a href="https://plus.google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), G Suite Developer Advocate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Developers using &lt;a href="http://developers.google.com/apps-script"&gt;Google Apps Script&lt;/a&gt; can now access the richer feature set of the updated &lt;a href="https://developers.google.com/sheets/"&gt;Google Sheets API&lt;/a&gt; with the &lt;a href="https://plus.google.com/102922870851314983585/posts/d8CtSuj9zgN"&gt;recent launch&lt;/a&gt; of the &lt;a href="https://developers.google.com/apps-script/advanced/sheets"&gt;Advanced Sheets Service&lt;/a&gt;. One key benefit of using an advanced service vs. native Apps Script objects, is that developers can access current API features (without having to wait for native support to come along). For example, the advanced service allows developers to access Sheets filters which make Add-ons more engaging.&lt;br /&gt;&lt;h3&gt;Filter functionality&amp;nbsp;&lt;/h3&gt;With the Sheets API, developers can already get filtered rows or set new filters on Sheets data. With the &lt;a href="https://developers.google.com/apps-script/advanced/sheets"&gt;Advanced Sheet Service&lt;/a&gt;, developers can now have their Add-ons respect those filters and apply new filters to modify what data is visible in the Sheets UI. Plus, with &lt;i&gt;any&lt;/i&gt; of the &lt;a href="https://developers.google.com/apps-script/guides/services/advanced"&gt;Apps Script advanced services&lt;/a&gt;, you can easily access the Sheets and other Google APIs without using the &lt;a href="https://developers.google.com/apps-script/reference/url-fetch/"&gt;UrlFetch service&lt;/a&gt; nor managing the authorization flow that you’d otherwise have to perform if using the REST API directly.  The snippet below will return the indexes of the filtered rows in a given Sheet. Note that it is also possible to retrieve the list of rows hidden manually, using the "hide row" menu item in Google Sheets, as indicated in the &lt;a href="https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#DimensionProperties"&gt;API documentation&lt;/a&gt;. In the code sample here, we’re only exposing rows hidden by filter. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt; function getIndexesOfFilteredRows(ssId, sheetId) {&lt;br /&gt;  var hiddenRows = [];&lt;br /&gt;  &lt;br /&gt;  // limit what's returned from the API&lt;br /&gt;  var fields = "sheets(data(rowMetadata(hiddenByFilter)),properties/sheetId)";&lt;br /&gt;  var sheets = Sheets.Spreadsheets.get(ssId, {fields: fields}).sheets;  &lt;br /&gt;  &lt;br /&gt;  for (var i = 0; i &amp;lt; sheets.length; i++) {&lt;br /&gt;    if (sheets[i].properties.sheetId == sheetId) {&lt;br /&gt;      var data = sheets[i].data;&lt;br /&gt;      var rows = data[0].rowMetadata;&lt;br /&gt;      for (var j = 0; j &amp;lt; rows.length; j++) {&lt;br /&gt;        if (rows[j].hiddenByFilter) hiddenRows.push(j);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return hiddenRows;&lt;br /&gt;}&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;The &lt;/span&gt;&lt;span style="font-family: &amp;quot;roboto mono&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;fields&lt;/span&gt;&amp;nbsp;parameter in the code snippet limits what's returned in the Sheets API response, requesting only the values that matter to your app. For more information, &lt;a href="https://developers.google.com/sheets/api/guides/concepts#partial_responses"&gt;check out this page&lt;/a&gt; in the Sheets API doc or &lt;a href="https://www.youtube.com/watch?v=T1FUDXRB7Ns"&gt;this recent video&lt;/a&gt; on field masks.&lt;br /&gt;&lt;h3&gt;See how some Add-ons use filtering&amp;nbsp;&lt;/h3&gt;There are a number of Add-ons that use advanced filtering in Sheets. Here are some good examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/yet-another-mail-merge/mgmgmhkohaenhokbdnlpcljckbhpbmef?utm_source=permalink"&gt;Yet Another Mail Merge&lt;/a&gt;: this Add-on helps users send email campaigns from a spreadsheet and is built to process only the filtered rows of a Sheet. Let's say you have a list of people who are registered for an event, but you've only accepted some of these registrants and need to send an email confirmation. With Yet Another Mail Merge and the updated API, you can filter out people you don't approve to attend and the Add-ons skips them without sending confirmations.&lt;/li&gt;&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/sankeysnip/jpkppcfcpedjgcobdcnflafbdajcjcco?utm_source=permalink"&gt;Sankey Snip&lt;/a&gt; and &lt;a href="https://chrome.google.com/webstore/detail/chordsnip/fdnefiodaifakeekehcdpcjibaogogdl?utm_source=permalink"&gt;Chord Snip&lt;/a&gt;: these Add-ons helps users create special chart types that aren't available in the Google Sheets UI. When respecting filters is enabled with these Add-ons, the charts will dynamically visualize filtered data. Check out the example below from the Chord Snip Add-on.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-Qjf6cqO6IVc/WO_EBOiCbcI/AAAAAAAABlo/QmdbvyN3rD0NodYy7pY49_tfIXSi6WZowCLcB/s1600/image00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="https://1.bp.blogspot.com/-Qjf6cqO6IVc/WO_EBOiCbcI/AAAAAAAABlo/QmdbvyN3rD0NodYy7pY49_tfIXSi6WZowCLcB/s400/image00.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Of course the API also provides the ability to add, update or delete filters on a Sheet. This is useful if you want to quickly display rows with a specific status to your users. One example would be if you built a workflow approval Add-on. You can show the user rows that are waiting for approval.  The snippet below applies the requested filter on a given Sheet—the API documentation describes a standard &lt;a href="https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#BasicFilter"&gt;basic filter object&lt;/a&gt;: &lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;function setSheetBasicFilter(ssId, BasicFilterSettings) {&lt;br /&gt;  //requests is an array of batchrequests, here we only use setBasicFilter&lt;br /&gt;  var requests = [&lt;br /&gt;    {&lt;br /&gt;      "setBasicFilter": {&lt;br /&gt;        "filter": BasicFilterSettings&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  ];&lt;br /&gt;  Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Yet Another Mail Merge, as many mass-mailing tools do, keeps track of all emails sent, opened and clicked. A tracking report is available in the spreadsheet sidebar, and clicking on the number of emails opened will automatically apply a filter to display only the matching rows—all rows with the status “opened.” &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-UYFXzWqSQ4k/WO_Eirljb1I/AAAAAAAABlw/bRzkYjNOjiMYZ9TXmcsjaytaK2BcEkpeQCLcB/s1600/yamm_blog_post.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="https://4.bp.blogspot.com/-UYFXzWqSQ4k/WO_Eirljb1I/AAAAAAAABlw/bRzkYjNOjiMYZ9TXmcsjaytaK2BcEkpeQCLcB/s400/yamm_blog_post.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now, you can determine filters applied in a Sheet directly through the &lt;a href="https://developers.google.com/sheets/"&gt;Sheets API&lt;/a&gt; or through &lt;a href="http://developers.google.com/apps-script"&gt;Apps Script&lt;/a&gt; apps and &lt;a href="https://developers.google.com/apps-script/add-ons/"&gt;Add-ons&lt;/a&gt; using the &lt;a href="https://developers.google.com/apps-script/advanced/sheets"&gt;Advanced Sheets Service&lt;/a&gt;, and continue to build the best experience for your users.&lt;br /&gt;&lt;h3&gt;About the Authors&amp;nbsp;&lt;/h3&gt;Romain Vialard is a &lt;a href="https://developers.google.com/experts/people/romain-vialard"&gt;Google Developer Expert&lt;/a&gt;. After some years spent as a G Suite consultant, he is now focused on products for G Suite and Google Apps users, including add-ons such as &lt;a href="https://chrome.google.com/webstore/detail/yet-another-mail-merge/mgmgmhkohaenhokbdnlpcljckbhpbmef"&gt;Yet Another Mail Merg&lt;/a&gt;e and &lt;a href="https://chrome.google.com/webstore/detail/form-publisher/hgmhbdjdjoahflgfmfpjlgpplihlechm"&gt;Form Publisher&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bruce Mcpherson is a &lt;a href="https://developers.google.com/experts/people/bruce-mcpherson"&gt;Google Developer Expert&lt;/a&gt;, an independent consultant, &lt;a href="http://ramblings.mcpher.com/"&gt;blogger&lt;/a&gt;&amp;nbsp;and author of &lt;a href="http://shop.oreilly.com/product/0636920045816.do"&gt;Going GAS&lt;/a&gt;, &lt;a href="http://shop.oreilly.com/product/0636920054115.do"&gt;Google Apps Script for Beginners&lt;/a&gt;, and &lt;a href="http://shop.oreilly.com/product/0636920048503.do"&gt;Google Apps Script for Developers&lt;/a&gt;.   &lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/M7uGx9ulQr8" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/742817980743507158" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/742817980743507158" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/M7uGx9ulQr8/using-google-sheets-filters-in-add-ons.html" title="Using Google Sheets filters in Add-ons with Google Apps Script" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-Qjf6cqO6IVc/WO_EBOiCbcI/AAAAAAAABlo/QmdbvyN3rD0NodYy7pY49_tfIXSi6WZowCLcB/s72-c/image00.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/04/using-google-sheets-filters-in-add-ons.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-4810571111010865231</id><published>2017-04-05T11:40:00.000-07:00</published><updated>2017-04-06T13:23:21.503-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Admin SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="google docs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Forms" /><category scheme="http://www.blogger.com/atom/ns#" term="Google sheets" /><title type="text">New Google Drive metrics now accessible from Reports API</title><content type="html">&lt;span class="post-author"&gt;Posted by Rio Akasaka, Product Manager, Google Drive and Wesley Chun (&lt;a href="https://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), G Suite Developer Advocate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You might have read that &lt;a href="https://gsuiteupdates.googleblog.com/2016/09/better-google-drive-auditing-and.html"&gt;we launched new metrics&lt;/a&gt; in the &lt;a href="https://developers.google.com/admin-sdk/reports/v1/get-start/getting-started"&gt;Admin SDK Reports API&lt;/a&gt; to help you gain reliable, easily-validated perspectives about users within your domain. Today, we're building on these features by giving administrators and developers even greater visibility into how files are shared both inside and outside of domain. These changes include:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;New metrics to supplement the set of metrics we launched last year&amp;nbsp;&lt;/li&gt;&lt;li&gt;New visibility information for audit events&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="https://developers.google.com/admin-sdk/reports/v1/reference/usage-ref-appendix-a/customers-docs"&gt;Deprecation of existing metrics&lt;/a&gt; from the Reports API&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;New Metrics&lt;/h3&gt;We’ve created a new set of metrics to complete the set we launched last year. With these new metrics you can:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gain insight into the visibility of files and their sharing state, which is useful for security and reporting. This will replace these older metrics:&lt;pre&gt;&lt;span id="docs-internal-guid-38f35a6a-3f38-984c-4e70-cad35a17041a"&gt;&lt;span style="font-family: &amp;quot;consolas&amp;quot;; font-size: 11pt; vertical-align: baseline; white-space: pre-wrap;"&gt;num_docs_internally_visible, num_docs_externally_visible, num_docs_shared_outside_domain.&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Report on product adoption within your domain with summary statistics about &lt;a href="https://developers.google.com/admin-sdk/reports/v1/reference/usage-ref-appendix-a/customers-drive"&gt;groups of users&lt;/a&gt;&amp;nbsp;(collaborators, viewers, creators and sharers). Take advantage of key adoption metrics such as 1-, 7-, and 30-day active users for Google Drive, Docs, Sheets, Slides, Forms, Drawings and more.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Simplify your calculation of “what has changed” in your domain using &lt;a href="https://developers.google.com/admin-sdk/reports/v1/updated-drive-metrics"&gt;delta metrics&lt;/a&gt; which pre-calculate changes in visibility and items owned.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;New Visibility Information&amp;nbsp;&lt;/h3&gt;Now, new visibility information is attached to every audit event which helps you quickly identify the permission change events that lead to files being shared differently both within and outside your domain. &lt;a href="https://developers.google.com/admin-sdk/reports/v1/reference/activity-ref-appendix-a/drive-event-names"&gt;Learn more&lt;/a&gt;.&lt;br /&gt;&lt;h3&gt;Deprecating Existing Metrics&amp;nbsp;&lt;/h3&gt;While we’re aware of the need to have reliable and timely data about your domain’s users and files on Google Drive, Drive’s data and infrastructure has grown considerably, requiring us to make some difficult technical tradeoffs regarding metrics. As a result, today marks the beginning of a 12-month deprecation timeline that will retire &lt;a href="https://developers.google.com/admin-sdk/reports/v1/reference/usage-ref-appendix-a/customers-docs"&gt;these existing metrics&lt;/a&gt; from the Reports API and eventually the Admin Console. These metrics will no longer be available starting &lt;b&gt;May 14, 2018&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;To get started using the Reports API and see all the different types of metrics you can report on for your domain, &lt;a href="https://developers.google.com/admin-sdk/reports/v1/updated-drive-metrics"&gt;check out the official documentation&lt;/a&gt;. We hope you find these features useful in your reporting.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/byg8FHeemsQ" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4810571111010865231" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4810571111010865231" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/byg8FHeemsQ/new-google-drive-metrics-now-accessible.html" title="New Google Drive metrics now accessible from Reports API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/04/new-google-drive-metrics-now-accessible.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-6291436877501401624</id><published>2017-04-03T10:00:00.000-07:00</published><updated>2017-04-04T19:32:55.876-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="oauth" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title type="text">Updates to end user consent for 3rd-party apps and Single Sign-on providers</title><content type="html">&lt;span class="post-author"&gt;Posted by Rodrigo Paiva, Product Manager, Nicholas Watson, Software Engineer and &lt;a href="https://twitter.com/wescpy"&gt;Wesley Chun&lt;/a&gt;, Developer Advocate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At Google, we're mindful of keeping our users’ data and account information secure. So whether you're writing an app that requires &lt;a href="https://gsuite-developers.googleblog.com/2016/09/setting-expectations-for-accessing-user-data-via-oauth.html"&gt;access to user data&lt;/a&gt; or helping your users &lt;a href="https://gsuite-developers.googleblog.com/2016/09/increased-account-security-via-oauth-2-0-token-revocation.html"&gt;change their passwords&lt;/a&gt;, we’ll keep you up-to-date on policy changes, and now today, when it comes to consent and 3rd-party applications. Starting April 10, 2017, if you’re an application developer or a 3rd-party Single Sign-On (SSO) provider, your G Suite users may encounter a redirect when they authenticate with your identity service to make it clear to users which account they’re authenticating as well as the permissions they’re granting to applications.&lt;br /&gt;&lt;br /&gt;These changes will occur on these platforms:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Google and 3rd-party applications on iOS&lt;/li&gt;&lt;li&gt;Mobile browsers on iOS and Android&lt;/li&gt;&lt;li&gt;Web browsers (Chrome, Firefox and other modern browsers)&lt;/li&gt;&lt;/ul&gt;Note that Android applications that use the standard authentication libraries are already prompting users to select appropriate account information, so they’re not impacted by these changes.&lt;br /&gt;&lt;h3&gt;More visibility with new permission requests for your application&lt;/h3&gt;It’s important that your users are presented with account information and credential consent, and apps should make this process easy and clear. One new change that you may now see is that only  non-standard permission requests will be presented in the secondary consent screen in your application.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Currently when an application requests permissions, all of them are displayed together. However, users should have greater visibility into permissions being requested beyond the standard “email address” and “profile” consent. By clicking to select their account, a user consents to these core permissions. The secondary consent screen will appear only if additional permissions are requested by the application.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-N_VeIB1DLA8/WOJ-KDlWbDI/AAAAAAAABlY/1MUK9jM00GQocsGprZf56rIFxN_Tk1L8gCLcB/s1600/Screen%2BShot%2B2017-04-03%2Bat%2B9.53.32%2BAM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="377" src="https://4.bp.blogspot.com/-N_VeIB1DLA8/WOJ-KDlWbDI/AAAAAAAABlY/1MUK9jM00GQocsGprZf56rIFxN_Tk1L8gCLcB/s640/Screen%2BShot%2B2017-04-03%2Bat%2B9.53.32%2BAM.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Only non-standard permissions will be presented in the secondary consent screen that the user must approve.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Along with these changes, your application name will be more visible to users, and they can click-through to get your contact information. We recommend application developers use a public-facing email address so that users can quickly contact you for support or assistance. For more details, &lt;a href="https://developers.google.com/identity/sign-in/web/devconsole-project"&gt;check out this developer guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If your application may also be used by G Suite customers that employ a 3rd-party Single Sign-On (SSO) service, we recommend that you utilize the &lt;a href="https://developers.google.com/identity/protocols/OpenIDConnect#hd-param"&gt;hd&lt;/a&gt; and/or &lt;a href="https://developers.google.com/identity/protocols/OpenIDConnect#login-hint"&gt;login_hint&lt;/a&gt; parameters, if applicable. Even with the changes to the 3rd-party SSO auth flow, these parameters will be respected if provided. You can review the &lt;a href="https://developers.google.com/identity/protocols/OpenIDConnect"&gt;OpenID Connect&lt;/a&gt; page in the documentation for more information.&lt;br /&gt;&lt;h3&gt;Changes coming for 3rd-party SSO redirection&lt;/h3&gt;G Suite users may also notice redirection when signing into 3rd-party SSO providers. If no accounts are signed in, the user must confirm the account after signing in to the 3rd-party SSO provider to ensure that they’re signed in with the correct G Suite account:&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-yavo7n3MXhY/WOHQSB7BA-I/AAAAAAAABkU/jagNggvomVsez0u2KONZ_o0bovXlaqIfQCLcB/s1600/keDE7kViun2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="https://3.bp.blogspot.com/-yavo7n3MXhY/WOHQSB7BA-I/AAAAAAAABkU/jagNggvomVsez0u2KONZ_o0bovXlaqIfQCLcB/s400/keDE7kViun2.png" width="357" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The end user who has just signed in with one Google account should select that account as confirmation.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;As mentioned, by clicking to select their account, a user is opting into “email address” and “profile” consent.  Once the user consents to any additional non-standard permissions that may be requested, they will be redirected back to your application.&lt;br /&gt;&lt;br /&gt;If the user is already signed in to one or more accounts that match the &lt;a href="https://developers.google.com/identity/protocols/OpenIDConnect#hd-param"&gt;hd&lt;/a&gt; hint, the Account Chooser will display all of the accounts and require the user to select the appropriate G Suite account before being redirected to the 3rd-party SSO provider then back to your application:&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-xxOjg1TaAp8/WOHQ7hOSRPI/AAAAAAAABkk/G6lch4ibhxI0PfHDX9GEZUIY4vxTvdsFwCLcB/s1600/JjSxhaA7CVL.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="https://2.bp.blogspot.com/-xxOjg1TaAp8/WOHQ7hOSRPI/AAAAAAAABkk/G6lch4ibhxI0PfHDX9GEZUIY4vxTvdsFwCLcB/s400/JjSxhaA7CVL.png" width="360" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;A user who is signed into several Google accounts will be required to choose the appropriate account.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;See updates starting April 2017&lt;/h3&gt;These changes will help your users understand their permissions more clearly across all platforms, whether they’re using Google or a 3rd-party SSO provider for authentication. We’ve started to roll out the new interstitial page on iOS devices, and changes for browsers will begin to roll out starting &lt;b&gt;April 10, 2017&lt;/b&gt;.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/SB0QPzjA2pI" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6291436877501401624" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6291436877501401624" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/SB0QPzjA2pI/updates-to-end-user-consent-for-3rd.html" title="Updates to end user consent for 3rd-party apps and Single Sign-on providers" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-N_VeIB1DLA8/WOJ-KDlWbDI/AAAAAAAABlY/1MUK9jM00GQocsGprZf56rIFxN_Tk1L8gCLcB/s72-c/Screen%2BShot%2B2017-04-03%2Bat%2B9.53.32%2BAM.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/04/updates-to-end-user-consent-for-3rd.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-2499262722659152592</id><published>2017-03-31T12:00:00.000-07:00</published><updated>2017-03-31T12:00:15.354-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Gmail APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Sheets API" /><title type="text">Using field masks with Google APIs for partial response</title><content type="html">&lt;span class="post-author"&gt;Posted by &lt;a href="https://twitter.com/wescpy"&gt;Wesley Chun&lt;/a&gt;, Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you write applications using Google APIs (not just G Suite ones, but most Google APIs including YouTube or Google Cloud Platform APIs), it's important to be mindful of the data that’s returned in the response payloads from API calls. If you're not, your apps are likely getting back much more data than they need which can affect the performance of your apps whether on mobile or a server backend.  &lt;br /&gt;&lt;br /&gt;That's why most Google APIs allow you to only filter the data you need from response payloads with field masks. To get you comfortable with &lt;i&gt;field masks&lt;/i&gt;, we’ve put together a video to demonstrate their use with various Google APIs: &lt;iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/T1FUDXRB7Ns" width="640"&gt;&lt;/iframe&gt;With field masks, you can specify exactly what fields an API should return in its response payload by providing a fields or part parameter in your calls. And once the API knows what you want, it will likely spend less time assembling your response too. Here’s an example Python call to fetch your sender addresses using the Gmail API (if &lt;i&gt;GMAIL&lt;/i&gt; is your service endpoint): &lt;br /&gt; &lt;pre&gt;&lt;code&gt;     addresses = GMAIL.users().settings().sendAs().list(&lt;br /&gt;             userId='me'&lt;br /&gt;     ).execute().get('sendAs')&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Whether you’re using a &lt;a href="http://developers.google.com/discovery/libraries"&gt;Client Library&lt;/a&gt; (as our Python call) or using HTTP directly with GET https://www.googleapis.com/gmail/v1/users/userId/settings/sendAs, this is the payload you get back from the API: &lt;br /&gt; &lt;pre&gt;&lt;code&gt;     {&lt;br /&gt;       "sendAs": [{&lt;br /&gt;         "sendAsEmail": string,&lt;br /&gt;         "displayName": string,&lt;br /&gt;         "replyToAddress": string,&lt;br /&gt;         "signature": string,&lt;br /&gt;         "isPrimary": boolean,&lt;br /&gt;         "isDefault": boolean,&lt;br /&gt;         "treatAsAlias": boolean,&lt;br /&gt;         "smtpMsa": {&lt;br /&gt;           "host": string,&lt;br /&gt;           "port": integer,&lt;br /&gt;           "username": string,&lt;br /&gt;           "password": string,&lt;br /&gt;           "securityMode": string&lt;br /&gt;         },&lt;br /&gt;         "verificationStatus": string&lt;br /&gt;       }, ...]&lt;br /&gt;     }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;i&gt;sendAs&lt;/i&gt; array gives you everything you need to know about each of your sender addresses. Did you know you can &lt;a href="https://www.youtube.com/watch?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ&amp;amp;v=kfeKF1zgwj0"&gt;change a user’s email signature using the Gmail API&lt;/a&gt; &lt;i&gt;without&lt;/i&gt; all of the data from above? You only need one field, or at most two: &lt;i&gt;sendAsEmail&lt;/i&gt; and perhaps the &lt;i&gt;isPrimary&lt;/i&gt; flag. By specifying a field mask with just those names from the &lt;i&gt;sendAs&lt;/i&gt; attribute, you can cut out all those unneeded fields. Check it out here in Python with the field mask bolded for emphasis (versus the sample code above that &lt;i&gt;doesn’t&lt;/i&gt; filter): &lt;br /&gt; &lt;pre&gt;&lt;code&gt;     addresses = GMAIL.users().settings().sendAs().list(&lt;br /&gt;             userId='me', &lt;b&gt;fields='sendAs(sendAsEmail,isPrimary)'&lt;/b&gt;&lt;br /&gt;     ).execute().get('sendAs')&lt;/code&gt;&lt;/pre&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://1.bp.blogspot.com/-VeeZ-c2EnLk/WN6huGrfE4I/AAAAAAAABjo/Urv4VW6RPIkBS3A_mmPi8E48cALoKiSaQCLcB/s1600/Field%2BMasks%2Bimage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="https://1.bp.blogspot.com/-VeeZ-c2EnLk/WN6huGrfE4I/AAAAAAAABjo/Urv4VW6RPIkBS3A_mmPi8E48cALoKiSaQCLcB/s400/Field%2BMasks%2Bimage.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Field masks filter our unnecessary data from Google API call responses.&lt;span id="docs-internal-guid-45c8ed61-25a7-f8c7-bfbd-206e61a66307"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span id="docs-internal-guid-45c8ed61-25a7-f8c7-bfbd-206e61a66307"&gt;&lt;span style="font-family: &amp;quot;roboto&amp;quot;; font-size: 10pt; font-style: italic; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span id="docs-internal-guid-45c8ed61-25a7-f8c7-bfbd-206e61a66307"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;In part two of this video series (coming soon), we’ll show you a different use case for field masks...for &lt;i&gt;update&lt;/i&gt; API calls. We’ll also provide some usage tips and demonstrate how field masks can be used in both read and update calls, how both types of calls are discrete, and how in some cases, you may use &lt;i&gt;both&lt;/i&gt; as part of a single API call. Stay tuned! &lt;br /&gt;&lt;br /&gt;To learn more about using field masks for partial response in API payloads, &lt;a href="https://developers.google.com/api-client-library/python/guide/performance#partial-response-fields-parameter"&gt;check out this section&lt;/a&gt; of the Client Library docs. For one of the most comprehensive write-ups on both (read and update) use cases, &lt;a href="https://developers.google.com/slides/how-tos/field-masks"&gt;see the guide&lt;/a&gt; in the Google Slides API documentation. &lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/kxPWYJ769gU" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/2499262722659152592" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/2499262722659152592" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/kxPWYJ769gU/using-field-masks-with-google-apis-for_31.html" title="Using field masks with Google APIs for partial response" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/T1FUDXRB7Ns/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/03/using-field-masks-with-google-apis-for_31.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-1747960262855200881</id><published>2017-03-30T11:30:00.000-07:00</published><updated>2017-04-02T21:41:58.770-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Admin SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Apps Script" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Gmail APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Calendar API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Classroom" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Sheets API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Sites API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Slides API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Tasks API" /><category scheme="http://www.blogger.com/atom/ns#" term="realtime API" /><title type="text">A new issue tracker for G Suite developers</title><content type="html">&lt;span class="post-author"&gt;Posted by &lt;a href="https://plus.google.com/102922870851314983585"&gt;Ryan Roth&lt;/a&gt;, Developer Programs Engineer and &lt;a href="https://twitter.com/wescpy"&gt;Wesley Chun&lt;/a&gt;, Developer Advocate, G Suite&lt;/span&gt;&lt;br /&gt;&lt;span class="post-author"&gt;&lt;br /&gt;&lt;/span&gt;You may have read recently that the &lt;a href="https://cloud.google.com/"&gt;Google Cloud Platform&lt;/a&gt; team &lt;a href="https://cloudplatform.googleblog.com/2017/03/a-new-issue-tracker-for-Google-Cloud-Platformud.html"&gt;upgraded to Issue Tracker&lt;/a&gt;, the same system that Google uses internally. This allows for improved collaboration between all of us and all of you. Issues you file will have better exposure internally, and you get improved transparency in terms of seeing the issues we’re actively working on. Starting today, &lt;a href="https://gsuite.google.com/"&gt;G Suite&lt;/a&gt; developers will also have a &lt;a href="https://issuetracker.google.com/bookmark-groups/78025"&gt;new issue tracker&lt;/a&gt; to which we’ve already migrated existing issues from previous systems. Whether it’s a bug that you’ve found, or if you wish to submit a favorite feature request, the new issue tracker is here for you. Heads up, you need to be logged in with your Google credentials to view or update issues in the tracker.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-Tl6jXa4XsOk/WN1XYRNgRxI/AAAAAAAABjQ/16Vi3eI_pRInypCNewHAZtvl0ir6W8TngCLcB/s1600/Issue%2Btracker%2Bimage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="290" src="https://4.bp.blogspot.com/-Tl6jXa4XsOk/WN1XYRNgRxI/AAAAAAAABjQ/16Vi3eI_pRInypCNewHAZtvl0ir6W8TngCLcB/s640/Issue%2Btracker%2Bimage.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The new issue tracker for G Suite developers.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Each G Suite API and developer tool has its own “component” number that you can search. For your convenience, below is the entire list. You may browse for issues relevant to the Google APIs that you’re using, or click on the convenience links to report an issue or request a new/missing feature:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566222"&gt;Google Apps Script&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191640&amp;amp;template=823905"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191640&amp;amp;template=824113"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566261"&gt;Google Drive SDK/API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191650&amp;amp;template=823909"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191650&amp;amp;template=824106"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566264"&gt;Gmail API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191602&amp;amp;template=823912"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191602&amp;amp;template=824107"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566223"&gt;Google Calendar API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191627&amp;amp;template=824103"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191627&amp;amp;template=823906"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566273"&gt;Google Sheets API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191608&amp;amp;template=823916"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191608&amp;amp;template=823917"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566281"&gt;Google Slides API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191598&amp;amp;template=824111"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191598&amp;amp;template=823918"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566231"&gt;G Suite Activity API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191587&amp;amp;template=823902"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191587&amp;amp;template=823903"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566232"&gt;G Suite Admin SDK&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191635&amp;amp;template=823904"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191635&amp;amp;template=824102"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566262"&gt;G Suite Marketplace&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191597&amp;amp;template=823910"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191597&amp;amp;template=823911"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566255"&gt;Google Classroom API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191645&amp;amp;template=823907"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191645&amp;amp;template=823908"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566257"&gt;Google Contacts API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191607&amp;amp;template=824104"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191607&amp;amp;template=824105"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566259"&gt;Google Picker API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191628&amp;amp;template=823913"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191628&amp;amp;template=823914"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566271"&gt;Google Realtime API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191646&amp;amp;template=824108"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191646&amp;amp;template=823915"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566276"&gt;Google Sites API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191651&amp;amp;template=824109"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191651&amp;amp;template=824110"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://issuetracker.google.com/savedsearches/566277"&gt;Google Tasks API&lt;/a&gt;: &lt;a href="https://issuetracker.google.com/issues/new?component=191603&amp;amp;template=824112"&gt;Report an issue&lt;/a&gt; - &lt;a href="https://issuetracker.google.com/issues/new?component=191603&amp;amp;template=823919"&gt;Request a feature&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;To get started, &lt;a href="https://developers.google.com/issue-tracker/"&gt;take a look at the documentation pages&lt;/a&gt;, as well as the &lt;a href="https://developers.google.com/issue-tracker/references/faq"&gt;FAQ&lt;/a&gt;. For more details, be sure to &lt;a href="https://cloudplatform.googleblog.com/2017/03/a-new-issue-tracker-for-Google-Cloud-Platformud.html"&gt;check out the Google Cloud Platform announcement&lt;/a&gt;, too. We look forward to working more closely with all of you soon!&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/WPo9vbpNA_4" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/1747960262855200881" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/1747960262855200881" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/WPo9vbpNA_4/a-new-issue-tracker-for-g-suite.html" title="A new issue tracker for G Suite developers" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-Tl6jXa4XsOk/WN1XYRNgRxI/AAAAAAAABjQ/16Vi3eI_pRInypCNewHAZtvl0ir6W8TngCLcB/s72-c/Issue%2Btracker%2Bimage.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/03/a-new-issue-tracker-for-g-suite.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-4670729321808492494</id><published>2017-03-09T10:32:00.000-08:00</published><updated>2017-03-09T14:59:02.665-08:00</updated><title type="text">Bring the power of your apps into Gmail with Add-ons</title><content type="html">&lt;span class="post-author"&gt;Posted by Thijs van As, Product Manager, Gmail&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Few things are as satisfying as completing a task. But at work, it’s not always so easy. The days are short and packed with to-dos, like following up on sales leads, logging support tickets or sending invoices. And while great apps exists to tackle these workstreams, most users have to flip between them and their inbox because email is still “central command” for task management.&lt;br /&gt;To solve this problem for users, today we're introducing the developer preview of Gmail Add-ons, a new way for G Suite users to access your app's functionality directly from Gmail in just one tap, no matter the device.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-HeFnmVgMiJ8/WMDL3f4TQgI/AAAAAAAABiM/4WEvlteH1Q4wGfI8r4sNl2n5ELNVQyhbgCLcB/s1600/Gmail%2BAdd-ons%2Bstill.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://4.bp.blogspot.com/-HeFnmVgMiJ8/WMDL3f4TQgI/AAAAAAAABiM/4WEvlteH1Q4wGfI8r4sNl2n5ELNVQyhbgCLcB/s1600/Gmail%2BAdd-ons%2Bstill.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;With Gmail Add-ons, developers can write an integration once and deploy it anywhere.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;Save your users time&lt;/h3&gt;Add-ons provide a way to surface the functionality of your app or service when the context calls for it. They’re built on a powerful framework, which makes it easy for developers to trigger workflows based on email content. Say a Gmail user receives an email from a sales lead, and wants to add that contact to her CRM solution. With Gmail Add-ons, she can enter the contact’s required info and look up their account in that CRM system without leaving Gmail. No more tabbing, copying and pasting or sifting between mobile apps in order to get things done. &lt;br /&gt;&lt;h3&gt;Write once, run anywhere&amp;nbsp;&lt;/h3&gt;&lt;br /&gt;With Gmail Add-ons, developers only build their integration once, and it runs natively in Gmail on web, Android and iOS right away. Users only install the Add-on once, too, and it shows up in Gmail across their devices. So instead of wasting time writing separate integrations for web and mobile, you can focus on bringing your app’s most powerful features right to your users when they need them most.   Gmail Add-ons are built in Apps Script using a newly-designed "Card" system that lets you easily combine different UI components. Developers can create a snappy user experience that feels like it was natively built into Gmail. The result: integrations that are cross-platform from the get-go that save your team time.&lt;br /&gt;&lt;h3&gt;See what’s possible by signing up for the developer preview today&amp;nbsp;&lt;/h3&gt;Gmail users will be able to install Add-ons via the G Suite Marketplace later this year, but that hasn’t stopped us from working with select partners to develop some amazing integrations to show what Add-ons are capable of.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-RwKBYhvwjqk/WMDM5Db0NAI/AAAAAAAABiU/PJjIj7e1ZOU1T8-AT_i1pok0hyc0EIk1wCLcB/s1600/intuit-and-prosperworks-v4-white.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="640" src="https://3.bp.blogspot.com/-RwKBYhvwjqk/WMDM5Db0NAI/AAAAAAAABiU/PJjIj7e1ZOU1T8-AT_i1pok0hyc0EIk1wCLcB/s640/intuit-and-prosperworks-v4-white.gif" width="317" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;i&gt;No matter the task, Gmail users can easily find the right Add-on for the job. Here's how you could seamlessly use ProsperWorks and Intuit right from Gmail.&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Intuit QuickBooks&lt;/b&gt;: The Intuit Add-on lets Gmail users and QuickBooks small business customers generate and send invoices and even confirm invoice status without ever leaving Gmail.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;ProsperWorks&lt;/b&gt;: The ProsperWorks Add-on makes it easy for Gmail users to check the contact info of people on email threads against the information stored in their CRM.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Salesforce&lt;/b&gt;: The Salesforce Add-on allows Gmail users to look up existing contacts, add new ones, as well as associate email threads with one or more existing opportunities in Salesforce, right from the Gmail app.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-yHbRlrinJvE/WMDNeoHmHhI/AAAAAAAABiY/h-okFd2xrHIGjjw9UD_v0wHuGyaQVorgQCLcB/s1600/salesforce-v5-white.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="640" src="https://4.bp.blogspot.com/-yHbRlrinJvE/WMDNeoHmHhI/AAAAAAAABiY/h-okFd2xrHIGjjw9UD_v0wHuGyaQVorgQCLcB/s640/salesforce-v5-white.gif" width="317" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;i&gt;The Salesforce Add-on makes it easy to capture background information from Gmail and tie it to a sales opportunity.&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;If you’re a developer, you can &lt;a href="http://g.co/GmailAddOns" target="_blank"&gt;sign up for our Developer Preview today&lt;/a&gt;. We expect to start sending invitations for early developer access soon.&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/v9RQ37YbUy8" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4670729321808492494" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4670729321808492494" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/v9RQ37YbUy8/bring-power-of-your-apps-into-gmail_9.html" title="Bring the power of your apps into Gmail with Add-ons" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://4.bp.blogspot.com/-HeFnmVgMiJ8/WMDL3f4TQgI/AAAAAAAABiM/4WEvlteH1Q4wGfI8r4sNl2n5ELNVQyhbgCLcB/s72-c/Gmail%2BAdd-ons%2Bstill.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/03/bring-power-of-your-apps-into-gmail_9.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-3348045243154523021</id><published>2017-03-02T12:28:00.000-08:00</published><updated>2017-03-06T17:19:09.038-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google Classroom" /><title type="text">Building #withClassroom: stories of real schools using Classroom integrations </title><content type="html">&lt;span class="post-author"&gt;By Lindsay Rumer, Product Marketing Manager, Google for Education&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-0MWLenXFMMQ/WLh8vRUm7PI/AAAAAAAABhI/0hZ4MIwbGo0NpNtNlChviATMbjBe7ajBgCLcB/s1600/classroom-api-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="408" src="https://2.bp.blogspot.com/-0MWLenXFMMQ/WLh8vRUm7PI/AAAAAAAABhI/0hZ4MIwbGo0NpNtNlChviATMbjBe7ajBgCLcB/s640/classroom-api-3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;A few years ago, &lt;a href="http://googleforeducation.blogspot.com/2015/06/new-ways-to-integrate-with-Google-Classroom.html" target="_blank"&gt;we launched the Classroom API&lt;/a&gt; to make it easier for developers to integrate their applications with Classroom, and for administrators to manage classes. Since then, &lt;a href="https://edu.google.com/classroom/apps/" target="_blank"&gt;hundreds of applications have integrated with Classroom&lt;/a&gt; to help teachers gamify their classes, improve students’ writing skills, build interactive presentations and more.&lt;br /&gt;&lt;br /&gt;Using the API, developers can build deep integrations that manage Classroom rosters, assignments and grades. Or they can simply embed the Classroom share button to let users quickly share content. For teachers and students, these integrations create a seamless experience between Classroom and their favorite education apps.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://edu.google.com/classroom/apps/" target="_blank"&gt;Valuable integrations&lt;/a&gt; have been built to support the needs of teachers and students in the classroom that showcase the creative possibilities available through the Classroom API. Today, we take a look at how some schools are using Classroom integrations.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Enriching lessons with rich content from BrainPOP&amp;nbsp;&lt;/h3&gt;In the words of Mike Jones, a teacher at Illinois State University’s K-8 Lab School, “Class time is precious. Why would I want to waste any of it with a process that can easily be automated?”&lt;br /&gt;&lt;br /&gt;Improved automation is one of the key reasons we’ve seen education applications integrate with Google Classroom and one of those applications is &lt;a href="https://www.brainpop.com/" target="_blank"&gt;BrainPOP&lt;/a&gt;.  BrainPOP offers digital educational content that engages students through animated movies, learning games, quizzes, concept mapping, movie-making, and more.&lt;br /&gt;&lt;br /&gt;The team at BrainPOP recognized that manually setting up individual student accounts for &lt;a href="https://www.brainpop.com/my-brainpop/" target="_blank"&gt;My BrainPOP&lt;/a&gt; could be a tedious task for teachers. Utilizing the Classroom API, the team at BrainPOP developed an integration that allows teachers to import their classes directly into My BrainPOP, automatically creating single sign-on-ready, student accounts and allowing students to log into BrainPOP through the Google launcher menu.  According to Jones, the integration “allows all staff to easily access the benefits of BrainPOP and do what they do best: help children learn.”&lt;br /&gt;&lt;h3&gt;Adjusting teaching tactics in real-time with Edulastic&amp;nbsp;&lt;/h3&gt;Egg Harbor Township in New Jersey holds an intensive summer program for its Title I elementary students who aren’t ready to enter the next grade level. During last year’s program, the school had just 12 days to address learning gaps, which meant teachers had to stay laser-focused on deficiencies and adjust teaching tactics quickly to help their students achieve success. Given the tight timeframe, the school turned to &lt;a href="https://www.edulastic.com/" target="_blank"&gt;Edulastic&lt;/a&gt;, an online assessment system that gives teachers instant teaching insights, and Google Classroom.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://4.bp.blogspot.com/-6BxXCCUdiWM/WLh9aCrnG7I/AAAAAAAABhQ/_odzUT4vIdcLfRyMiR8xNzG2XePGLHmhQCEw/s1600/classroom-api-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="https://4.bp.blogspot.com/-6BxXCCUdiWM/WLh9aCrnG7I/AAAAAAAABhQ/_odzUT4vIdcLfRyMiR8xNzG2XePGLHmhQCEw/s640/classroom-api-4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Edulastic’s Google Classroom sync meant the summer program could be set up quickly with no additional passwords or logins for teachers or students. As a result of the pilot, Egg Harbor Township Title I teachers used this integration beyond their summer program and the entire school subsequently decided to use it for their assessments as well.&lt;br /&gt;&lt;h3&gt;Simplifying setup and syncing with Little SIS&amp;nbsp;&lt;/h3&gt;Classroom integrations can also give IT leaders insights and administrative powers in Classroom. For instance, &lt;a href="http://labs.amplifiedit.com/little-sis-for-classroom/" target="_blank"&gt;Little SIS for Classroom&lt;/a&gt;, an app designed and built by the team at &lt;a href="http://labs.amplifiedit.com/" target="_blank"&gt;Amplified Labs&lt;/a&gt;, is using the Classroom Courses and Guardians APIs to automate the setup and daily sync of Google Classroom classes, rosters, and guardian invites from information in the school’s SIS.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://3.bp.blogspot.com/-oqyJUU6xhgI/WLh9qR6W3YI/AAAAAAAABhU/ZCn_JE9Q7hsV-Qz_dD0MjbveW1RDSLJPgCLcB/s1600/classroom-api-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="414" src="https://3.bp.blogspot.com/-oqyJUU6xhgI/WLh9qR6W3YI/AAAAAAAABhU/ZCn_JE9Q7hsV-Qz_dD0MjbveW1RDSLJPgCLcB/s640/classroom-api-2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;San Francisco Unified School District is piloting a roster-integrated approach to Google Classroom that they hope to scale to their 57,000 students. Executive Director of Technology &amp;amp; Innovation David Malone first approached Amplified Labs with guarded optimism because of the district’s size, but since installation he feels much more confident. “Despite being new to the market, I am really impressed at the maturity and thoughtfulness of the Little SIS app. It loaded our entire district’s G Suite users and 7,500 Classroom classes in just a few minutes, and allowed us to get a great baseline on the current state of adoption.”&lt;br /&gt;&lt;br /&gt;We’ve been thrilled to see what developers have created using the Classroom API capabilities and the impact that it's had on teachers, students and administrators. If you’re interested in learning more about the Classroom API, check out &lt;a href="http://developers.google.com/classroom"&gt;developers.google.com/classroom&lt;/a&gt; or search for &lt;a href="http://stackoverflow.com/questions/tagged/google-classroom" target="_blank"&gt;google-classroom&lt;/a&gt; on Stack Overflow. You can also &lt;a href="https://groups.google.com/forum/#!forum/classroom-dev-announce" target="_blank"&gt;join our announcement list to keep up with updates to our API&lt;/a&gt;.     &lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/LgnYGE5-Y_A" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/3348045243154523021" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/3348045243154523021" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/LgnYGE5-Y_A/building-with-Classroom-API-stories-of-real-schools-using-Classroom-integrations.html" title="Building #withClassroom: stories of real schools using Classroom integrations " /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-0MWLenXFMMQ/WLh8vRUm7PI/AAAAAAAABhI/0hZ4MIwbGo0NpNtNlChviATMbjBe7ajBgCLcB/s72-c/classroom-api-3.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/03/building-with-Classroom-API-stories-of-real-schools-using-Classroom-integrations.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-5160284618298288859</id><published>2017-02-23T11:12:00.001-08:00</published><updated>2017-02-23T11:26:42.424-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Slides API" /><title type="text">Adding text and shapes with the Google Slides API</title><content type="html">&lt;em&gt;Posted by &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="http://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/em&gt;&lt;br /&gt;&lt;dl&gt;When the &lt;a href="http://gsuite.google.com/products/slides"&gt;Google Slides&lt;/a&gt;team &lt;a href="http://goo.gl/o6EFwk"&gt;launched&lt;/a&gt; their very first API last November, it immediately opened up a whole new class of applications. These applications have the ability to interact with the Slides service, so you can perform operations on presentations programmatically. Since its launch, we've published several videos to help you realize some of those possibilities, showing you how to: &lt;/dl&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://goo.gl/o6EFwk"&gt;Replace text and images in slides&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://goo.gl/Yb06ZC"&gt;Generate slides from spreadsheet data&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://goo.gl/zkbilV"&gt;Format text in presentations&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Today, we're releasing the latest Slides API tutorial in our video series. This one goes back to basics a bit: adding text to presentations. But we also discuss &lt;em&gt;shapes&lt;/em&gt;—not only adding shapes to slides, but also adding text within shapes. Most importantly, we cover one best practice when using the API: create your own object IDs. By doing this, developers can execute more requests while minimizing API calls. &lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/sAsi9QRgWuI" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;strong&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;Developers use &lt;code&gt;insertText&lt;/code&gt; requests to tell the API to add text to slides. This is true whether you're adding text to a textbox, a shape or table cell. Similar to the &lt;a href="http://developers.google.com/sheets"&gt;Google Sheets API&lt;/a&gt;, all requests are made as JSON payloads sent to the API's &lt;code&gt;batchUpdate()&lt;/code&gt; method. Here's the JavaScript for inserting text in some object (&lt;code&gt;&lt;em&gt;objectID&lt;/em&gt;&lt;/code&gt;) on a slide:  &lt;br /&gt;&lt;pre class="prettyprint"&gt;{&lt;br /&gt;    "insertText": {&lt;br /&gt;        "objectId": objectID,&lt;br /&gt;        "text": "Hello World!\n"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Adding shapes is a bit more challenging, as you can see from &lt;em&gt;its&lt;/em&gt;sample JSON structure:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;{&lt;br /&gt;"createShape": {&lt;br /&gt;        "shapeType": "SMILEY_FACE",&lt;br /&gt;        "elementProperties": {&lt;br /&gt;            "pageObjectId": slideID,&lt;br /&gt;            "size": {&lt;br /&gt;                "height": {&lt;br /&gt;                    "magnitude": 3000000,&lt;br /&gt;                    "unit": "EMU"&lt;br /&gt;                },&lt;br /&gt;                "width": {&lt;br /&gt;                    "magnitude": 3000000,&lt;br /&gt;                    "unit": "EMU"&lt;br /&gt;                }&lt;br /&gt;            },&lt;br /&gt;            "transform": {&lt;br /&gt;                "unit": "EMU",&lt;br /&gt;                "scaleX": 1.3449,&lt;br /&gt;                "scaleY": 1.3031,&lt;br /&gt;                "translateX": 4671925,&lt;br /&gt;                "translateY": 450150&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Placing or manipulating shapes or images on slides requires more information so the cloud service can properly render these objects. Be aware that it does involve some math, as you can see from the &lt;a href="http://developers.google.com/slides/how-tos/transform"&gt;Page Elements page&lt;/a&gt; in the docs as well as the &lt;a href="http://developers.google.com/slides/concepts/transforms"&gt;Transforms concept guide&lt;/a&gt;. In the video, I drop a few hints and good practices so you don't have to start from scratch.&lt;br /&gt;&lt;br /&gt;Regardless of how complex your requests are, if you have at least one, say in an array named &lt;code&gt;&lt;em&gt;requests&lt;/em&gt;&lt;/code&gt;, you'd make an API call with the aforementioned &lt;code&gt;batchUpdate()&lt;/code&gt; method, which in Python looks like this (assuming &lt;code&gt;&lt;em&gt;SLIDES&lt;/em&gt;&lt;/code&gt; is the service endpoint and a presentation ID of &lt;code&gt;&lt;em&gt;deckID&lt;/em&gt;)&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;SLIDES.presentations().batchUpdate(presentationId=deckID,&lt;br /&gt;        body=requests).execute()&lt;br /&gt;&lt;/pre&gt;For a detailed look at the &lt;em&gt;complete&lt;/em&gt; code sample featured in the DevByte, check out the &lt;a href="http://goo.gl/DfeIwK"&gt;deep dive post&lt;/a&gt;. As you can see, adding text is fairly straightforward. If you want to learn how to &lt;em&gt;format and style&lt;/em&gt; that text, check out the &lt;a href="http://goo.gl/zkbilV"&gt;Formatting Text post and video&lt;/a&gt; as well as the &lt;a href="http://developers.google.com/slides/concepts/text"&gt;text concepts guide&lt;/a&gt;. &lt;br /&gt;To learn how to perform text search-and-replace, say to replace placeholders in a template deck, check out the &lt;a href="http://goo.gl/o6EFwk"&gt;Replacing Text &amp;amp; Images post and video&lt;/a&gt; as well as the &lt;a href="https://devsite.googleplex.com/slides/how-tos/merge"&gt;merging data into slides guide&lt;/a&gt;. We hope these developer resources help you create that next great app that automates the task of producing presentations for your users! &lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/VzGHraQVzw8" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/5160284618298288859" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/5160284618298288859" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/VzGHraQVzw8/adding-text-and-shapes-with-google.html" title="Adding text and shapes with the Google Slides API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/sAsi9QRgWuI/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/02/adding-text-and-shapes-with-google.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-4839607678651674305</id><published>2017-02-08T10:14:00.001-08:00</published><updated>2017-03-06T17:35:09.776-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apps Script" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Marketplace" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Docs API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Sheets API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Slides API" /><title type="text">G Suite Developer Sessions at Google Cloud Next 2017</title><content type="html">&lt;em&gt;Posted by &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="http://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;There are over 200 sessions happening next month at &lt;a href="http://cloudnext.withgoogle.com/"&gt;Google Cloud's Next 2017 conference&lt;/a&gt;in San Francisco... so many choices! Along with content geared towards &lt;a href="http://cloud.google.com/"&gt;Google Cloud Platform&lt;/a&gt;, this year features the addition of &lt;a href="http://gsuite.google.com/"&gt;G Suite&lt;/a&gt; so all 3 pillars of cloud computing (IaaS, PaaS, SaaS) are represented!&lt;br /&gt;&lt;br /&gt;There are already thousands of developers including Independent Software Vendors (ISVs) creating solutions to help schools and enterprises running the G Suite collaboration and productivity suite (formerly Google Apps). If you're thinking about becoming one, consider building applications that extend, enhance, and integrate G Suite apps and data with other mission critical systems to help businesses and educational institutions succeed. &lt;br /&gt;&lt;br /&gt;Looking for inspiration? Here's a preview of some of the sessions that current &lt;em&gt;and&lt;/em&gt; potential G Suite developers should consider:&lt;br /&gt;&lt;br /&gt;The first is "&lt;a href="https://cloudnext.withgoogle.com/schedule#target=automating-internal-processes-using-apps-script-and-apis-for-docs-editors-cdc887d3-e9b0-4677-a811-d9368dae9f07"&gt;Automating internal processes using Apps Script and APIs for Docs editors&lt;/a&gt;." Not only will you hear directly from senior engineers on the Google Sheets &amp;amp; Google Slides REST API teams, but you'll also find out how existing customers are &lt;em&gt;already&lt;/em&gt; doing so! Can't wait to get started with these APIs? Here are the &lt;a href="http://goo.gl/N1RPwC"&gt;intro blog post &amp;amp; video&lt;/a&gt; for the latest &lt;a href="http://developers.google.com/sheets"&gt;Google Sheets API&lt;/a&gt; as well as the &lt;a href="http://goo.gl/o6EFwk"&gt;intro blog post &amp;amp; video&lt;/a&gt; for &lt;a href="http://developers.google.com/slides"&gt;the Google Slides API&lt;/a&gt;. Part of the talk also covers &lt;a href="http://developers.google.com/apps-script"&gt;Google Apps Script&lt;/a&gt;, the Javascript-in-the-cloud solution that gives developers programmatic access to authorized G Suite data along with the ability to connect to other Google and external services.&lt;br /&gt;&lt;br /&gt;If that's not enough Apps Script for you, or you're new to that technology, swing by to hear its Product Manager give you an introduction in his talk, "&lt;a href="https://cloudnext.withgoogle.com/schedule#target=using-google-apps-script-to-automate-g-suite-41c276ca-56c4-4de9-b06b-777a4f91e764"&gt;Using Google Apps Script to automate G Suite&lt;/a&gt;." If you haven't heard of Apps Script before, you'll be wondering why you haven't until now! If you want a headstart, here's a &lt;a href="http://goo.gl/1sXeuD"&gt;quick intro video&lt;/a&gt; to give you an idea of what you can do with it! &lt;br /&gt;&lt;br /&gt;Did you know that Apps Script also powers "&lt;a href="http://developers.google.com/apps-script/add-ons"&gt;add-ons&lt;/a&gt;" which extend the functionality of Google Docs, Sheets, and Forms? Then come to "&lt;a href="https://cloudnext.withgoogle.com/schedule#target=building-g-suite-add-ons-with-google-apps-script-dfc50f98-4a0c-4904-bed5-126dcc0def30"&gt;Building G Suite add-ons with Google Apps Script&lt;/a&gt;". Learn how you can leverage the power of Apps Script to build custom add-ons for your business, or monetize by making them available in &lt;a href="http://apps.google.com/marketplace"&gt;the G Suite Marketplace&lt;/a&gt; where administrators or employees can install your add-ons for their organizations.&lt;br /&gt;&lt;br /&gt;In addition to Apps Script apps, all your Google Docs, Sheets, and Slides documents live in Google Drive. But did you know that Drive is not just for individual file storage? Hear directly from a Drive Product Manager on how you can, "&lt;a href="https://cloudnext.withgoogle.com/schedule#target=building-enterprise-ready-apps-with-the-team-drives-api-e08b7fa0-46eb-4f61-a5c2-569098a97212" target="_blank"&gt;Building enterprise-ready apps with Team Drives API&lt;/a&gt;." With &lt;a href="http://developers.google.com/drive"&gt;the Drive API&lt;/a&gt; and &lt;a href="http://gsuiteupdates.googleblog.com/2016/11/google-team-drives-early-adopter.html"&gt;Team Drives&lt;/a&gt;, you can extend what Drive can do for your organization. One example from the most recent &lt;a href="http://google.com/io"&gt;Google I/O&lt;/a&gt; tells the story of &lt;a href="http://goo.gl/Fqfh8g"&gt;how WhatsApp used the Drive API&lt;/a&gt; to back up all your conversations! To get started with your own Drive API integration, check out this &lt;a href="http://goo.gl/EySSQV"&gt;blog post and short video&lt;/a&gt;. Confused by when you should use Google Drive or &lt;a href="http://cloud.google.com/storage"&gt;Google Cloud Storage&lt;/a&gt;? I've got an app, err &lt;a href="http://youtu.be/vyIap827rHs"&gt;video&lt;/a&gt;, for that too! :-)&lt;br /&gt;&lt;br /&gt;Not a software engineer but still code as part of your profession? Want to build a custom app for your department or line of business without having to worry about IT overhead? You may have heard about &lt;a href="https://blog.google/products/g-suite/customize-your-g-suite-experience-app-maker-and-recommended-apps/"&gt;Google App Maker&lt;/a&gt;, our low-code development tool that does exactly that. Curious to learn more about it? Hear directly from its Product Manager lead in his talk entitled, "&lt;a href="https://cloudnext.withgoogle.com/schedule#target=build-powerful-custom-apps-fast-with-app-maker-on-g-suite-cfe4b053-1817-4444-af94-de3468698e46" target="_blank"&gt;Building powerful custom apps fast with App Maker on G Suite&lt;/a&gt;."&lt;br /&gt;&lt;br /&gt;All of these talks are just waiting for you at &lt;a href="https://cloudnext.withgoogle.com/"&gt;Next&lt;/a&gt;, the best place to get your feet wet developing for G Suite, and of course, the Google Cloud Platform. Start by checking out the session &lt;a href="https://cloudnext.withgoogle.com/schedule"&gt;schedule&lt;/a&gt;. Next will also offer many opportunities to meet and interact with industry peers along with representatives from all over Google who love the cloud. &lt;a href="https://cloudnext.withgoogle.com/registration/#/signon"&gt;Register&lt;/a&gt; today and see you in San Francisco! &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://cloudnext.withgoogle.com/" target="_blank"&gt;&lt;img border="0" height="155" src="https://3.bp.blogspot.com/-Zs8BvFJNM94/WJtfgo8UtRI/AAAAAAAABgk/F3O8vnMoCMsE2w2kIHovBc5eP6SB8gdnACLcB/s320/Screen%2BShot%2B2017-02-08%2Bat%2B10.11.12%2BAM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/zZONBfSuXKk" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4839607678651674305" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4839607678651674305" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/zZONBfSuXKk/g-suite-developer-sessions-at-google.html" title="G Suite Developer Sessions at Google Cloud Next 2017" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-Zs8BvFJNM94/WJtfgo8UtRI/AAAAAAAABgk/F3O8vnMoCMsE2w2kIHovBc5eP6SB8gdnACLcB/s72-c/Screen%2BShot%2B2017-02-08%2Bat%2B10.11.12%2BAM.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/02/g-suite-developer-sessions-at-google.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-7053336712655607035</id><published>2017-01-11T09:27:00.000-08:00</published><updated>2017-01-11T09:27:12.114-08:00</updated><title type="text">Enhancements to coursework in the Classroom API</title><content type="html">&lt;i&gt;Posted by&amp;nbsp;&lt;span style="font-family: &amp;quot;Open Sans&amp;quot;; font-size: 14.6667px; white-space: pre-wrap;"&gt;Greg Zecchini, Google Classroom Software Engineer&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Hundreds of education developers use the &lt;a href="https://developers.google.com/classroom/"&gt;Classroom API&lt;/a&gt; to integrate their applications with &lt;a href="http://classroom.google.com/"&gt;Google Classroom&lt;/a&gt;. Last year, we &lt;a href="https://gsuite-developers.googleblog.com/2016/05/build-deeper-integrations-with-google_23.html"&gt;announced&lt;/a&gt;the ability for external applications to read and write assignments. We've received a lot of feedback from developers who began integrating assignments with Classroom, and they said that they wanted to do even more.&lt;br /&gt;Today, we're making the coursework endpoints more robust, with additional management capabilities. Applications can now: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create and update questions &lt;/li&gt;&lt;li&gt;Modify and delete coursework &lt;/li&gt;&lt;li&gt;Add Drive items and YouTube videos to coursework and student submissions &lt;/li&gt;&lt;/ul&gt;&lt;a href="https://flat.io/edu"&gt;Flat Education&lt;/a&gt;, a collaborative music notation app, already integrates with Classroom to let teachers quickly synchronize rosters and assignments, and design music activities accessible to students with just one click from Google Classroom. Flat has been piloting the new API functionality to create  a more seamless integration.  Flat CTO Vincent Giersch notes, "the support of Google Drive in the Google Classroom API is simply great: all the music scores created with G Suite for Education accounts on Flat being already Drive files, we can now directly add our Drive files in the assignments and students submissions. This will make possible for teachers and students to use Google Classroom with Flat as they would do with Google Docs." &lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/C9TjwtZksQA" width="560"&gt;&lt;/iframe&gt; &lt;br /&gt;In case you missed it, we've also made other recent updates to managing &lt;a href="https://support.google.com/edu/classroom/answer/6388136?hl=en&amp;amp;ref_topic=7175351"&gt;parents and guardians&lt;/a&gt; with the API. Classroom sends daily or weekly email summaries to guardians, and applications using the API to manage guardians can now detect if guardian visibility is enabled for a course, and list all guardians and guardian invitations in a domain. &lt;br /&gt;&lt;br /&gt;For more details on what you can build with coursework, review the &lt;a href="https://developers.google.com/classroom/guides/manage-coursework"&gt;documentation&lt;/a&gt;, the &lt;a href="https://developers.google.com/classroom/faq"&gt;FAQ&lt;/a&gt;, and ask questions on &lt;a href="http://stackoverflow.com/questions/tagged/google-classroom"&gt;Stack Overflow&lt;/a&gt;. As always, let us know what you're building using the #withClassroom hashtag on Twitter or Google+. We look forward to working together to make it even easier for teachers and students to use the tools they love with Classroom. &lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/a9dzBccg01s" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7053336712655607035" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7053336712655607035" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/a9dzBccg01s/enhancements-to-coursework-in-classroom.html" title="Enhancements to coursework in the Classroom API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/C9TjwtZksQA/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2017/01/enhancements-to-coursework-in-classroom.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-6882052494891965538</id><published>2016-12-14T10:16:00.002-08:00</published><updated>2017-03-06T17:35:09.780-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Slides API" /><title type="text">Formatting text with the Google Slides API</title><content type="html">&lt;p&gt;&lt;em&gt;Posted by &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="http://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/em&gt;&lt;/p&gt;&lt;p&gt;It's common knowledge that presentations utilize a set of images to impart ideas to the audience. As a result, one of the best practices for creating great slide decks is to minimize the overall amount of text. It means that if you &lt;em&gt;do&lt;/em&gt; have text in a presentation, the (few) words you use must have higher impact &lt;em&gt;and&lt;/em&gt; be visually appealing. This is even more true when the slides are generated by a software application, say using the &lt;a href="http://developers.google.com/slides?utm_campaign=gsuite_series_googleslidesapi_121416&amp;utm_source=appdev&amp;utm_medium=blog"&gt;Google Slides API&lt;/a&gt;, rather than being crafted by hand. &lt;/p&gt;&lt;p&gt;The G Suite team recently &lt;a href="http://goo.gl/o6EFwk"&gt;launched&lt;/a&gt; the first Slides API, opening up a whole new category of applications. Since then, we've published several videos to help you realize some of those possibilities, showing you how to &lt;a href="http://goo.gl/o6EFwk"&gt;replace text and images in slides&lt;/a&gt; as well as how to &lt;a href="http://goo.gl/Yb06ZC"&gt;generate slides from spreadsheet data&lt;/a&gt;. To round out this trifecta of key API use cases, we're adding text formatting to the conversation. &lt;/p&gt;&lt;CENTER&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/_O2aUCJyCoQ?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/CENTER&gt;&lt;p&gt;Developers manipulate text in Google Slides by sending API requests. Similar to the &lt;a href="http://developers.google.com/sheets?utm_campaign=gsuite_series_googleslidesapi_121416&amp;utm_source=appdev&amp;utm_medium=blog"&gt;Google Sheets API&lt;/a&gt;, these requests come in the form of JSON payloads sent to the API's &lt;code&gt;batchUpdate()&lt;/code&gt; method. Here's the JavaScript for inserting text in some shape (&lt;code&gt;&lt;em&gt;shapeID&lt;/em&gt;&lt;/code&gt;) on a slide:  &lt;pre class="prettyprint"&gt;{&lt;br /&gt;    "insertText": {&lt;br /&gt;        "objectId": shapeID,&lt;br /&gt;        "text": "Hello World!\n"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;In the video, developers learn that &lt;em&gt;writing&lt;/em&gt; text, such as the request above, is less complex than reading or formatting because both the latter require developers to know how text on a slide is structured. Notice for writing that just the copy, and optionally an index, are all that's required. (That index defaults to zero if not provided.) &lt;/p&gt;&lt;p&gt;Assuming "Hello World!" has been successfully inserted in a shape on a slide, a request to bold just the "Hello" looks like this: &lt;/p&gt;&lt;pre class="prettyprint"&gt;{&lt;br /&gt;    "updateTextStyle": {&lt;br /&gt;        "objectId": shapeID,&lt;br /&gt;        "style": {&lt;br /&gt;            "bold": true&lt;br /&gt;        },&lt;br /&gt;        "textRange": {&lt;br /&gt;            "type": "FIXED_RANGE",&lt;br /&gt;            "startIndex": 0,&lt;br /&gt;            "endIndex": 5&lt;br /&gt;        },&lt;br /&gt;        "fields": "bold"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;If you've got at least one request, like the ones above, in an array named &lt;code&gt;&lt;em&gt;requests&lt;/em&gt;&lt;/code&gt;, you'd ask the API to execute them with just one call to the API, which in Python looks like this (assuming &lt;code&gt;&lt;em&gt;SLIDES&lt;/em&gt;&lt;/code&gt; is your service endpoint and the slide deck ID is &lt;code&gt;&lt;em&gt;deckID&lt;/em&gt;)&lt;/code&gt;: &lt;pre class="prettyprint"&gt;SLIDES.presentations().batchUpdate(presentationId=deckID,&lt;br /&gt;        body=requests).execute()&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;To better understand text structure &amp; styling in Google Slides, check out the &lt;a href="http://developers.google.com/slides/concepts/text?utm_campaign=gsuite_series_googleslidesapi_121416&amp;utm_source=appdev&amp;utm_medium=blog"&gt;text concepts guide&lt;/a&gt;in the documentation. For a detailed look at the &lt;em&gt;complete&lt;/em&gt; code sample featured in the DevByte, check out &lt;a href="http://goo.gl/YwUilm"&gt;the deep dive post&lt;/a&gt;. To see more samples for common API operations, take a look at &lt;a href="http://developers.google.com/slides/samples?utm_campaign=gsuite_series_googleslidesapi_121416&amp;utm_source=appdev&amp;utm_medium=blog"&gt;this page&lt;/a&gt;. We hope the videos and all these developer resources help you create that next great app that automates producing highly impactful presentations for your users! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/MDPw6ZL-08c" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6882052494891965538" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/6882052494891965538" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/MDPw6ZL-08c/formatting-text-with-the-google-slides-api.html" title="Formatting text with the Google Slides API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/_O2aUCJyCoQ/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2016/12/formatting-text-with-the-google-slides-api.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-4325453563710970378</id><published>2016-12-07T11:32:00.000-08:00</published><updated>2016-12-07T12:09:14.895-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Administrative APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Gmail" /><category scheme="http://www.blogger.com/atom/ns#" term="Gmail APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><title type="text">Modifying email signatures with the Gmail API</title><content type="html">&lt;p&gt;&lt;em&gt;Posted by &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="http://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/em&gt;&lt;/p&gt;The Gmail API team introduced a new settings feature &lt;a href="http://goo.gl/xY2g9O"&gt;earlier this year&lt;/a&gt;, and today, we're going to explore some of that goodness, showing developers how to update Gmail user settings with the API.  &lt;p&gt;Email continues to be a dominant form of communication, personally and professionally, and our email signature serves as both a lightweight introduction and a business card. It's also a way to slip-in a sprinkling of your personality. Wouldn't it be interesting if you could automatically change your signature whenever you wanted without using the Gmail settings interface every time? That is exactly what our latest video is all about. &lt;/p&gt;&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/kfeKF1zgwj0?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;p&gt;If your app has already created a Gmail API service endpoint, say in a variable named &lt;code&gt;&lt;em&gt;GMAIL&lt;/em&gt;&lt;/code&gt;, and you have the &lt;code&gt;&lt;em&gt;YOUR_EMAIL&lt;/em&gt;&lt;/code&gt; email address whose signature should be changed as well as the text of the new signature, updating it via the API is as pretty straightforward, as illustrated by this Python call to the &lt;code&gt;&lt;em&gt;GMAIL&lt;/em&gt;.users().settings().sendAs().patch()&lt;/code&gt; method:  &lt;pre class="prettyprint"&gt;signature = {'signature': '"I heart cats."  ~anonymous'}&lt;br /&gt;GMAIL.users().settings().sendAs().patch(userId='me',&lt;br /&gt;        sendAsEmail=YOUR_EMAIL, body=signature).execute()&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;For more details about the code sample used in the requests above as well as in the video, check out &lt;a href="http://goo.gl/NoA8CI"&gt;the deepdive post&lt;/a&gt;. In addition to email signatures, other settings the API can modify include: filters, forwarding (addresses and auto-forwarding), IMAP and POP settings to control external email access, and the vacation responder. Be aware that while API access to most settings are available for any G Suite Gmail account, a few sensitive operations, such as modifying send-as aliases or forwarding, are restricted to users with domain-wide authority. &lt;/p&gt;&lt;p&gt;Developers interested in using the Gmail API to access email threads and messages instead of settings can check out &lt;a href="http://twitter.com/googledevs/status/596786681946091520"&gt;this other video&lt;/a&gt; where we show developers how to search for threads with a minimum number of messages, say to look for the most discussed topics from a mailing list. Regardless of &lt;em&gt;your&lt;/em&gt; use-case, you can find out more about the Gmail API in &lt;a href="http://developers.google.com/gmail/api?utm_campaign=gsuite_series_emailsignatures_120716&amp;utm_source=appdev&amp;utm_medium=blog"&gt;the developer documentation&lt;/a&gt;. If you're new to the API, we suggest you start with &lt;a href="http://developers.google.com/gmail/api/guides?utm_campaign=gsuite_series_emailsignatures_120716&amp;utm_source=appdev&amp;utm_medium=blog"&gt;the overview page&lt;/a&gt; which can point you in the right direction! &lt;/p&gt;&lt;p&gt;Be sure to subscribe to the &lt;a href="http://youtube.com/GoogleDevelopers"&gt;Google Developers channel&lt;/a&gt; and check out other episodes in the &lt;a href="http://goo.gl/JpBQ40"&gt;G Suite Dev Show video series&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/xstsiM3E7gw" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4325453563710970378" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4325453563710970378" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/xstsiM3E7gw/modifying-email-signatures-with-the-gmail-api.html" title="Modifying email signatures with the Gmail API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/kfeKF1zgwj0/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2016/12/modifying-email-signatures-with-the-gmail-api.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-4204996439536573231</id><published>2016-11-30T10:26:00.003-08:00</published><updated>2017-03-06T17:35:39.156-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="decks" /><category scheme="http://www.blogger.com/atom/ns#" term="Developers" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="Google sheets" /><category scheme="http://www.blogger.com/atom/ns#" term="GSuite" /><category scheme="http://www.blogger.com/atom/ns#" term="presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="Sheets API" /><category scheme="http://www.blogger.com/atom/ns#" term="spreadsheets" /><title type="text">Generating slides from spreadsheet data</title><content type="html">&lt;p&gt;&lt;em&gt;Posted by &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="http://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The G Suite team recently &lt;a href="http://goo.gl/o6EFwk"&gt;launched&lt;/a&gt; the very first &lt;a href="http://developers.google.com/slides?utm_campaign=gsuite_series_googleslidesapi_113016&amp;utm_source=appdev&amp;utm_medium=blog"&gt;Google Slides API&lt;/a&gt;, opening up a whole new set of possibilities, including leveraging data &lt;em&gt;already sitting&lt;/em&gt; in a spreadsheet or database, and programmatically generating slide decks or slide content &lt;em&gt;based&lt;/em&gt; on that data. Why is this a big deal? One of the key advantages of slide decks is that they can take database or spreadsheet data and make it more presentable for human consumption. This is useful when the need arises to communicate the information reflected by that data to management or potential customers. &lt;/p&gt;&lt;p&gt;Walking developers through a short application demonstrating both the Sheets and Slides APIs to make this happen is the topic of today's DevByte video. The sample app starts by reading all the necessary data from the spreadsheet using the Sheets API. The Slides API takes over from there, creating new slides for the data, then populating those slides &lt;em&gt;with&lt;/em&gt; the Sheets data. &lt;/p&gt;&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/h2_oiGv3ZdQ?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;p&gt;Developers interact with Slides by sending API requests. Similar to the &lt;a href="http://developers.google.com/sheets?utm_campaign=gsuite_series_googleslidesapi_113016&amp;utm_source=appdev&amp;utm_medium=blog"&gt;Google Sheets API&lt;/a&gt;, these requests come in the form of JSON payloads. You create an array like in the JavaScript pseudocode below featuring requests to create a cell table on a slide and import a chart from a Sheet: &lt;/p&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;var requests = [&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;{"createTable": {&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"elementProperties":&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{"pageObjectId": &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;slideID&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"rows": 8,&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"columns": 4&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}},&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;{"createSheetsChart": {&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"spreadsheetId": &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sheetID&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"chartId": &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;chartID&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"linkingMode": "LINKED",&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"elementProperties": {&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"pageObjectId": &lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;slideID&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"size": {&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"height": { ... },&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"width": { ... }&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"transform": { ... }&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}}&lt;/span&gt;&lt;/div&gt;&lt;span id="docs-internal-guid-de87ffa0-b674-7056-1f39-9fc7eac13ac8"&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;br&gt;If you've got at least one request, say in a variable named &lt;code&gt;&lt;em&gt;requests&lt;/em&gt;&lt;/code&gt; (as above), including the Sheet's &lt;code&gt;&lt;em&gt;sheetID&lt;/em&gt;&lt;/code&gt; and &lt;code&gt;&lt;em&gt;chartID&lt;/em&gt;&lt;/code&gt; plus the presentation page's &lt;code&gt;&lt;em&gt;slideID&lt;/em&gt;&lt;/code&gt;. You'd then pass it to the API with just one call to the &lt;code&gt;presentations().batchUpdate()&lt;/code&gt; command, which in Python looks like the below if &lt;code&gt;&lt;em&gt;SLIDES&lt;/em&gt;&lt;/code&gt; is your API service endpoint: &lt;br&gt;&lt;div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-left: 36pt; margin-top: 0pt;"&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;SLIDES&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;.presentations().batchUpdate(presentationId=&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;slideID&lt;/span&gt;&lt;span style="background-color: transparent; color: black; font-family: 'Roboto Mono'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;span id="docs-internal-guid-de87ffa0-b675-063e-e640-582e660a1323"&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body=&lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;"&gt;requests&lt;/span&gt;&lt;span style="font-family: &amp;quot;Roboto Mono&amp;quot;; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"&gt;).execute()&lt;/span&gt;&lt;/span&gt;&lt;p&gt;Creating tables is fairly straightforward. Creating charts has some magical features, one of those being the &lt;code&gt;linkingMode&lt;/code&gt;. A value of "LINKED" means that if the Sheet data changes (altering the chart in the Sheet), the same chart in a slide presentation can be refreshed to match the latest image, either by the API or in the Slides user interface! You can also request a plain old static image that doesn't change with the data by selecting a value of "NOT_LINKED_IMAGE" for &lt;code&gt;linkingMode&lt;/code&gt;. More on this can be found in the &lt;a href="https://developers.google.com/slides/reference/rest/v1/presentations/request?utm_campaign=gsuite_series_googleslidesapi_113016&amp;utm_source=appdev&amp;utm_medium=blog#CreateSheetsChartRequest"&gt;documentation&lt;/a&gt;on creating charts, and check out the video where you'll see both those API requests in action. &lt;/p&gt;&lt;p&gt;For a detailed look at the &lt;em&gt;complete&lt;/em&gt; code sample featured in the video, check out &lt;a href="http://goo.gl/Fa34S3"&gt;the deep dive post&lt;/a&gt;. We look forward to seeing the interesting integrations you build with the power of both APIs! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/WbJXUhwhuEw" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4204996439536573231" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4204996439536573231" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/WbJXUhwhuEw/generating-slides-from-spreadsheet-data.html" title="Generating slides from spreadsheet data" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/h2_oiGv3ZdQ/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2016/11/generating-slides-from-spreadsheet-data.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-7796845369685919065</id><published>2016-11-16T12:38:00.000-08:00</published><updated>2016-11-16T12:48:54.974-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API" /><category scheme="http://www.blogger.com/atom/ns#" term="APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Developers" /><category scheme="http://www.blogger.com/atom/ns#" term="G Suite" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google sheets" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Sheets API" /><category scheme="http://www.blogger.com/atom/ns#" term="GSuite" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="Sheets API" /><category scheme="http://www.blogger.com/atom/ns#" term="spreadsheets" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="video" /><title type="text">Formatting cells with the Google Sheets API</title><content type="html">&lt;i&gt;Posted by &lt;a href="Posted by Wesley Chun (@wescpy), Developer Advocate, G Suite"&gt;Wesley Chun&lt;/a&gt; (&lt;a href="http://twitter.com/wescpy"&gt;@wescpy&lt;/a&gt;), Developer Advocate, G Suite&lt;/i&gt;&lt;br&gt;At Google I/O earlier this year, we &lt;a href="http://goo.gl/ikttYs"&gt;launched a new Google Sheets API&lt;/a&gt; (click &lt;a href="http://youtu.be/Gk-xpjgUwx4"&gt;here&lt;/a&gt; to watch the entire announcement). The updated API includes many new features that weren't available in previous versions, including access to more functionality found in the Sheets desktop and mobile user interfaces. Formatting cells in Sheets is one example of something that wasn't possible with previous versions of the API and is the subject of today's DevByte video. &lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/86q5TMzvRqo?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;In our &lt;a href="http://goo.gl/N1RPwC"&gt;previous Sheets API video&lt;/a&gt;, we demonstrated how to get data into and out of a Google Sheet programmatically, walking through a simple script that reads rows out of a relational database and transferring the data to a new Google Sheet. The Sheet created using the code from that video is where we pick up today. &lt;p&gt;Formatting spreadsheets is accomplished by creating a set of request commands in the form of JSON payloads, and sending them to the API. Here is a sample JavaScript Object made up of an array of requests (only one this time) to bold the first row of the default Sheet automatically created for you (whose ID is 0): &lt;/p&gt;&lt;pre class="prettyprint"&gt;{"requests": [&lt;br /&gt;    {"repeatCell": {&lt;br /&gt;        "range": {&lt;br /&gt;            "sheetId": 0,&lt;br /&gt;            "startRowIndex": 0,&lt;br /&gt;            "endRowIndex": 1&lt;br /&gt;        },&lt;br /&gt;        "cell": {&lt;br /&gt;            "userEnteredFormat": {&lt;br /&gt;                "textFormat": {&lt;br /&gt;                    "bold": true&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        },&lt;br /&gt;        "fields": "userEnteredFormat.textFormat.bold"&lt;br /&gt;    }}&lt;br /&gt;]}&lt;br /&gt;&lt;/pre&gt;With at least one request, say in a variable named &lt;em&gt;requests&lt;/em&gt; and the ID of the sheet as &lt;em&gt;SHEET_ID&lt;/em&gt;, you send them to the API via an HTTP POST to &lt;font face ="Roboto Mono"&gt;https://sheets.googleapis.com/v4/spreadsheets/{&lt;em&gt;SHEET_ID&lt;/em&gt;}:batchUpdate&lt;/font&gt;, which in Python, would be a single call that looks like this: &lt;pre class="prettyprint"&gt;SHEETS.spreadsheets().batchUpdate(spreadsheetId=&lt;i&gt;SHEET_ID&lt;/i&gt;,&lt;br /&gt;        body=&lt;i&gt;requests&lt;/i&gt;).execute()&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;For more details on the code in the video, check out &lt;a href="http://goo.gl/oez34q"&gt;the deepdive blog post&lt;/a&gt;. As you can probably guess, the key challenge is in constructing the JSON payload to send to API calls—the &lt;a href="http://developers.google.com/sheets/samples?utm_campaign=gsuite_discussion_formattingcells_111616&amp;utm_source=appdev&amp;utm_medium=blog"&gt;common operations samples&lt;/a&gt; can really help you with this. You can also check out our &lt;a href="http://g.co/codelabs/sheets"&gt;JavaScript codelab&lt;/a&gt; where we guide you through writing a Node.js app that manages customer orders for a toy company, featuring the toy orders data we looked at today but in a relational database. While the resulting equivalent Sheet is featured prominently in today's video, we will revisit it again in an upcoming episode showing you how to generate slides with spreadsheet data using &lt;a href="http://goo.gl/o6EFwk"&gt;the new Google Slides API&lt;/a&gt;, so stay tuned for that! &lt;/p&gt;&lt;p&gt;We hope all these resources help developers enhance their next app using G Suite APIs! Please subscribe to our channel and tell us what topics you would like to see in other episodes of &lt;a href="http://goo.gl/JpBQ40"&gt;the G Suite Dev Show&lt;/a&gt;! &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/_co2PeueVIM" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7796845369685919065" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/7796845369685919065" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/_co2PeueVIM/formatting-cells-with-the-google-sheets-api.html" title="Formatting cells with the Google Sheets API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/86q5TMzvRqo/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2016/11/formatting-cells-with-the-google-sheets-api.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-192847188203777974</id><published>2016-11-09T10:30:00.000-08:00</published><updated>2017-03-06T17:34:18.472-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google APIs" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Drive SDK" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Slides API" /><title type="text">Introducing the Google Slides API</title><content type="html">&lt;em&gt;Posted by &lt;a href="http://google.com/+WesleyChun"&gt;Wesley Chun&lt;/a&gt;, Developer Advocate, G Suite&lt;/em&gt;&lt;br /&gt;At Google I/O 2016, we gave developers a &lt;a href="http://goo.gl/ikttYs"&gt;preview&lt;/a&gt; of the Google Slides API. Since then, the gears have been cranking at full speed, and we've been working with various early-access partners and developers to showcase what you can do with it. Today, we're happy to &lt;a href="http://blog.google/products/g-suite/slides-api"&gt;announce&lt;/a&gt; that the Slides API v1 is now generally available and represents the first time that developers have ever been able to programmatically access Slides! &lt;br /&gt;The Slides API breaks new ground, changing the way that presentations are created. No longer do they require manual creation by users on their desktops or mobile devices. Business data on inventory items like retail merchandise, homes/property, hotels/lodging, restaurants/menus, venues/events, and other "cataloged" assets can be instantly turned into presentations based on pre-existing slide templates. Traditionally, the sheer amount of data (and of course time[!]) that went into creating these slide decks made it unwieldy if done by hand. Applications leveraging the API can easily generate presentations like these, customized as desired, and in short order. &lt;br /&gt;Developers use the API by crafting a JSON payload for each request. (We recommend you batch multiple commands together to send to the API.) You can think of these as actions one can perform from the Slides user interface but available programmatically. To give you an idea of how the new API works, here are what some requests look like for several common operations: &lt;br /&gt;&lt;pre class="prettyprint"&gt;// create new slide (title &amp;amp; body layout)&lt;br /&gt;{&lt;br /&gt;    "createSlide": {&lt;br /&gt;        "slideLayoutReference": {&lt;br /&gt;            "predefinedLayout": "TITLE_AND_BODY"&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;},&lt;br /&gt;// insert text into textbox&lt;br /&gt;{&lt;br /&gt;    "insertText": {&lt;br /&gt;        "objectId": &lt;i&gt;titleID&lt;/i&gt;,&lt;br /&gt;        "text": "Hello World!"&lt;br /&gt;    }&lt;br /&gt;},&lt;br /&gt;// add bullets to text paragraphs&lt;br /&gt;{&lt;br /&gt;    "createParagraphBullets": {&lt;br /&gt;        "objectId": &lt;i&gt;shapeID&lt;/i&gt;,&lt;br /&gt;        "textRange": {&lt;br /&gt;            "type": "ALL"&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;},&lt;br /&gt;// replace text "variables" with image&lt;br /&gt;{&lt;br /&gt;    "replaceAllShapesWithImage": {&lt;br /&gt;        "imageUrl": &lt;i&gt;imageURL&lt;/i&gt;,&lt;br /&gt;        "replaceMethod": "CENTER_INSIDE",&lt;br /&gt;        "containsText": {&lt;br /&gt;            "text": "{{COMPANY_LOGO}}"&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;If you're interested in seeing what developers have already built using the API, take a look at our initial set of partner integrations by Conga, Trello, Lucidchart, Zapier and more, as described in detail in our &lt;a href="http://blog.google/products/g-suite/slides-api"&gt;G Suite blog post&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/8LSUbKZq4ZY?list=PLOU2XLYxmsIJJFx_MVCQJ7eWF3gDxklgJ" width="560"&gt;&lt;/iframe&gt;&lt;/center&gt;To help you get started, check out the DevByte above from &lt;a href="http://goo.gl/JpBQ40"&gt;our new series&lt;/a&gt; dedicated to G Suite developers. In the video, we demonstrate how to take "variables" or placeholders in a template deck and use the API to generate new decks replacing those proxies with the desired text or image. Want to dive deeper into its code sample? Check out &lt;a href="https://goo.gl/lMkRUX"&gt;this blogpost&lt;/a&gt;. If you're not a Python developer, it'll be your pseudocode as you can use &lt;em&gt;any&lt;/em&gt; language supported by the &lt;a href="http://developers.google.com/discovery/libraries"&gt;Google APIs Client Libraries&lt;/a&gt;. Regardless of your development environment, you can use similar "scaffolding" to generate many presentations with varying content for your users. Stay tuned for more videos that highlight other Slides API features. &lt;br /&gt;The Slides API is available to projects in your &lt;a href="http://console.developers.google.com/"&gt;Google Developers console&lt;/a&gt; today. Developers can find out more in &lt;a href="http://developers.google.com/slides"&gt;the official documentation&lt;/a&gt; which features &lt;a href="https://developers.google.com/slides/how-tos/overview"&gt;an API overview plus Quickstarts&lt;/a&gt;, sample code in multiple languages and environments, to bootstrap your next project. We look forward to seeing all the amazing slide deck generating applications you build with our first ever API! &lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/Uew3cCjpOIc" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/192847188203777974" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/192847188203777974" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/Uew3cCjpOIc/introducing-google-slides-api.html" title="Introducing the Google Slides API" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/8LSUbKZq4ZY/default.jpg" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2016/11/introducing-google-slides-api.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-1377183911445147227.post-4351425724168911900</id><published>2016-10-13T14:32:00.001-07:00</published><updated>2016-10-13T14:32:48.777-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gmail" /><category scheme="http://www.blogger.com/atom/ns#" term="Google sheets" /><title type="text">Peeking into the future of work with Salesforce</title><content type="html">&lt;p&gt;&lt;i&gt;Posted by Tom Holman, Product Manager, Google Sheets&lt;/i&gt;&lt;/p&gt; &lt;p&gt;&lt;i&gt;Originally posted to &lt;a href="https://blog.google/topics/google-cloud/peek-into-the-future-of-work-with-salesforce/"&gt;Google Cloud&lt;/a&gt;&lt;/i&gt;&lt;/p&gt; &lt;p&gt;When it comes to redefining how people go about their everyday work, Google and Salesforce have shared a remarkably similar path, with our roots planted firmly in the cloud.&lt;/p&gt; &lt;p&gt;That's why we were very excited to share the stage last week at &lt;a href="https://success.salesforce.com/Sessions?eventId=a1Q3000000qQOd9#/session/a2q3A000000sWQtQAM"&gt;Dreamforce&lt;/a&gt; to showcase two integrations that Salesforce built on top of &lt;a href="https://gsuite.google.com/together/"&gt;G Suite&lt;/a&gt;: Salesforce Lightning for Gmail and Sales Cloud integration with Google Sheets. In addition to existing integrations with Google Calendar, Gmail (for Salesforce IQ), Drive and Contacts, these new offerings will go a long way in helping people work effectively with smarter tools. &lt;/p&gt; &lt;h3&gt;Salesforce Lightning for Gmail&lt;/h3&gt; &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://2.bp.blogspot.com/-LyqBV60gVyY/V__oF3xpVZI/AAAAAAAABfc/-85OiqgoY_sgRxzs4S87GoCgn2xuQ1apgCLcB/s1600/image00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://2.bp.blogspot.com/-LyqBV60gVyY/V__oF3xpVZI/AAAAAAAABfc/-85OiqgoY_sgRxzs4S87GoCgn2xuQ1apgCLcB/s640/image00.png" width="640" height="359" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div text-align: center;"&gt;&lt;i&gt;Salesforce Lightning for Gmail&lt;/i&gt;&lt;/div&gt;  &lt;p&gt;At Dreamforce, we showcased the upcoming Lightning for Gmail integration, which brings together our leading CRM and email services. &lt;/p&gt; &lt;p&gt;With this integration, sales reps can now streamline repetitive but important tasks: they can  review Salesforce records relevant to their emails, add contacts from their address book into Salesforce, and even create new Salesforce records, all from within Gmail. &lt;/p&gt; &lt;p&gt;A pilot of Lightning for Gmail will be available by the end of this year for free to all Salesforce customers. Interested customers can contact their Salesforce account managers to sign up for the pilot program.&lt;/p&gt; &lt;h3&gt;Sales Cloud and Google Sheets&lt;/h3&gt; &lt;a href="https://3.bp.blogspot.com/-siG8FCDDTbE/V__o1v9T4rI/AAAAAAAABfs/0BPdO1nDsFcV5HobEE-_s_bkxRx6gPw5QCLcB/s1600/image02.png" imageanchor="1" &gt;&lt;img border="0" src="https://3.bp.blogspot.com/-siG8FCDDTbE/V__o1v9T4rI/AAAAAAAABfs/0BPdO1nDsFcV5HobEE-_s_bkxRx6gPw5QCLcB/s320/image02.png" width="320" height="162" /&gt;&lt;/a&gt;&lt;a href="https://3.bp.blogspot.com/-CSK-pBMM9Z0/V__o5hekM4I/AAAAAAAABfw/3_iCxYDEMck-J6jT0FsGFFFRCp3qvkFGQCLcB/s1600/image01.png" imageanchor="1" &gt;&lt;img border="0" src="https://3.bp.blogspot.com/-CSK-pBMM9Z0/V__o5hekM4I/AAAAAAAABfw/3_iCxYDEMck-J6jT0FsGFFFRCp3qvkFGQCLcB/s320/image01.png" width="320" height="165" /&gt;&lt;/a&gt; &lt;div text-align: center;"&gt;&lt;i&gt;Link any Sales Cloud List View to a source Google Sheet, and view, edit, and delete that data directly.&lt;/i&gt;&lt;/div&gt; &lt;p&gt;The Sales Cloud integration with Sheets, meanwhile, makes it easy for sales reps to link any Salesforce List View to a Google Sheet. Users can also view, edit, and delete records within Sheets and sync those changes back to Salesforce. Better still, the integration also supports your business logic and validation rules. &lt;/p&gt; &lt;p&gt;We gave a joint preview of the Sales Cloud and Google Sheets integration &lt;a href="https://www.youtube.com/watch?v=Gk-xpjgUwx4"&gt;at Google I/O this summer&lt;/a&gt;, and today are happy to announce that it will be available in beta to all Sales Cloud customers by the end of this year. &lt;/p&gt; &lt;p&gt;We had a blast working with the Salesforce team to bring these new solutions to life.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/fVYoqYpObjk" height="1" width="1" alt=""/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4351425724168911900" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1377183911445147227/posts/default/4351425724168911900" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/fVYoqYpObjk/peeking-into-future-of-work-with.html" title="Peeking into the future of work with Salesforce" /><author><name>Google Apps Developer Blog Editor</name><uri>http://www.blogger.com/profile/07808045840831274565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img1.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://2.bp.blogspot.com/-LyqBV60gVyY/V__oF3xpVZI/AAAAAAAABfc/-85OiqgoY_sgRxzs4S87GoCgn2xuQ1apgCLcB/s72-c/image00.png" height="72" width="72" /><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://gsuite-developers.googleblog.com/2016/10/peeking-into-future-of-work-with.html</feedburner:origLink></entry></feed>
