Google API实战与操作

Google api实战与操作

      • 一. Google API 权限配置
      • 二. 操作API
        • 2.1 引入依赖
        • 2.2 导入代码

Google官网

实现一套用java程序控制GoogleAPI实现自动生成监控日报等功能,具体能操作Gsheet及document

一. Google API 权限配置

打开上面官网,新建项目
在这里插入图片描述
启用API
在这里插入图片描述
搜索sheet及document
在这里插入图片描述

在这里插入图片描述.点击试用后进入API界面 点击创建凭据
在这里插入图片描述
创建OAuth 客户端重定向记得跟下面配置一样,因为需要先登录才能授权
在这里插入图片描述
生成完成后点击下载到本地,相当于你的Token
在这里插入图片描述

这时候就可以生成表格了

二. 操作API

2.1 引入依赖

<!--        google文档--><dependency><groupId>com.google.api-client</groupId><artifactId>google-api-client</artifactId><version>1.31.2</version></dependency><dependency><groupId>com.google.apis</groupId><artifactId>google-api-services-sheets</artifactId><version>v4-rev614-1.18.0-rc</version></dependency><dependency><groupId>com.google.oauth-client</groupId><artifactId>google-oauth-client-jetty</artifactId><version>1.31.4</version></dependency><dependency><groupId>com.google.cloud</groupId><artifactId>google-cloud-storage</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-drive --><dependency><groupId>com.google.apis</groupId><artifactId>google-api-services-drive</artifactId><version>v3-rev197-1.25.0</version></dependency><dependency><groupId>com.google.apis</groupId><artifactId>google-api-services-docs</artifactId><version>v1-rev20220609-2.0.0</version></dependency><dependency><groupId>org.gitlab4j</groupId><artifactId>gitlab4j-api</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.google.cloud</groupId><artifactId>libraries-bom</artifactId><version>25.4.0</version><type>pom</type><scope>import</scope></dependency>

将上面生成的Token导入项目

2.2 导入代码

package com.shopee.bank.business.utility;import com.baomidou.mybatisplus.extension.api.R;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.docs.v1.Docs;
import com.google.api.services.docs.v1.DocsScopes;
import com.google.api.services.docs.v1.model.*;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.Spreadsheet;
import com.google.api.services.sheets.v4.model.SpreadsheetProperties;
import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
import com.google.api.services.sheets.v4.model.ValueRange;
import com.google.common.collect.Lists;
import io.swagger.models.auth.In;
import lombok.Builder;
import lombok.Data;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;/*** @author kaiyi.wang* @ClassName GoogleSheetUtil.java* @Description* @createTime 2022/07/05*/
public class GoogleUtil {private static final String APPLICATION_NAME = "Quickstart";private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();private static final String TOKENS_DIRECTORY_PATH = "tokens";private static final List<String> SCOPES_READ = Lists.newArrayList(SheetsScopes.SPREADSHEETS_READONLY);private static final List<String> SCOPES_CREATE = Lists.newArrayList(SheetsScopes.SPREADSHEETS,DriveScopes.DRIVE_FILE);private static final List<String> DOCS_SCOPES = Lists.newArrayList(DocsScopes.all());public static final String PHFoldID="1msqpxxxxx9vx82Cln";public static final String IDFoldID="1VyxuzHxxxxxxxHR";/*** TODO 下载的应用授权文件,这里记得换成自己的授权文件*/private static final String CREDENTIALS_FILE_PATH = "/credentials.json";private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT,List<String> scopes) throws IOException {// Load client secrets.InputStream in = GoogleUtil.class.getResourceAsStream(CREDENTIALS_FILE_PATH);if (in == null) {throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);}GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));// Build flow and trigger user authorization request.GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes).setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))).setAccessType("offline").build();LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");}public static void main(String[] args) throws IOException, GeneralSecurityException {
//       createSpreadsheet("测试");
//      }public static String createSpreadsheet(String title) throws IOException, GeneralSecurityException {final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();// Create the sheets API clientSheets service = new Sheets.Builder(new NetHttpTransport(),GsonFactory.getDefaultInstance(),getCredentials(HTTP_TRANSPORT,SCOPES_CREATE)).setApplicationName("Sheets samples").build();// Create new spreadsheet with a titleSpreadsheet spreadsheet = new Spreadsheet().setProperties(new SpreadsheetProperties().setTitle(title));spreadsheet = service.spreadsheets().create(spreadsheet).setFields("spreadsheetId").execute();// Prints the new spreadsheet idSystem.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId());return spreadsheet.getSpreadsheetId();}public static void updateSheet(String sid,List<List<Object>> writeData,String dimension,String writeRange) throws IOException, GeneralSecurityException {final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();// Create the sheets API clientSheets service = new Sheets.Builder(new NetHttpTransport(),GsonFactory.getDefaultInstance(),getCredentials(HTTP_TRANSPORT,SCOPES_CREATE)).setApplicationName("Sheets samples").build();writeSomething(writeData, service, sid,dimension,writeRange);}//COLUMNS / ROWSpublic static void writeSomething(List<List<Object>> myData, Sheets service, String sid,String dimension,String writeRange) {try {
//            String writeRange = "工作表1!A:F";ValueRange vr = new ValueRange().setValues(myData).setMajorDimension(dimension);UpdateValuesResponse raw = service.spreadsheets().values().update(sid, writeRange, vr).setValueInputOption("RAW").execute();} catch (Exception e) {e.printStackTrace();}}@Data@Builderpublic static class VInfo{private String name;private String count;}/*** A1 符号* 一种语法,用于使用包含工作表名称以及使用列字母和行号的开始和结束单元格坐标的字符串来定义单元格或单元格范围。在引用绝对范围的单元格时,此方法最常见且最有用。** 显示示例* Sheet1!A1:B2指的是 Sheet1 前两行中的前两个单元格。* Sheet1!A:A指 Sheet1 第一列中的所有单元格。* Sheet1!1:2指 Sheet1 前两行中的所有单元格。* Sheet1!A5:A指的是工作表 1 第一列的所有单元格,从第 5 行开始。* A1:B2指第一个可见工作表的前两行中的前两个单元格。* Sheet1指 Sheet1 中的所有单元格。* 'My Custom Sheet'!A:A指名为“我的自定义工作表”的工作表第一列中的所有单元格。带有空格、特殊字符或字母数字组合的工作表名称需要单引号。* 'My Custom Sheet'指“我的自定义工作表”中的所有单元格。* 提示:在可能的情况下,为电子表格中的对象使用不同的名称。例如,A1 指的是第一个可见工作表中的单元格 A1,而“A1”指的是名为 A1 的工作表中的所有单元格。同样,Sheet1 引用 Sheet1 中的所有单元格。但是,如果有一个名为“Sheet1”的命名范围,则 Sheet1 指的是命名范围,而“Sheet1”指的是工作表。* @throws GeneralSecurityException* @throws IOException*/// 读取电子表格public static void readSheet() throws GeneralSecurityException, IOException {// Build a new authorized API client service.final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();final String spreadsheetId = "1XiZZT2ctZ8JMjGy2GYOPmsat5CD24U9r0wo6vro-z9Q";    // 这个是官方的 spreadsheetId,读取自己的Google Sheet换成对应ID即可final String range = "aml_process_tab!A1:F12"; // 读取的表格范围,命名规范: {sheet表名称}!{开始单元格}:{结束单元格}Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,SCOPES_READ)).setApplicationName(APPLICATION_NAME).build();ValueRange response = service.spreadsheets().values().get(spreadsheetId, range).execute();List<List<Object>> values = response.getValues();if (values == null || values.isEmpty()) {System.out.println("No data found.");} else {for (List row : values) {for (int i = 0; i < row.size(); i++) {System.out.print(row.get(i) + "\t\t");}System.out.println("");}}}public static List<String> moveFileToFolder(String fileId, String folderId)throws IOException, GeneralSecurityException {final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,SCOPES_CREATE)).setApplicationName(APPLICATION_NAME).build();// Retrieve the existing parents to removeFile file = service.files().get(fileId).setFields("parents").execute();StringBuilder previousParents = new StringBuilder();for (String parent : file.getParents()) {previousParents.append(parent);previousParents.append(',');}try{// Move the file to the new folderfile = service.files().update(fileId, null).setAddParents(folderId).setRemoveParents(previousParents.toString()).setFields("id, parents").execute();return file.getParents();}catch (GoogleJsonResponseException e) {// TODO(developer) - handle error appropriatelySystem.err.println("Unable to move file: " + e.getDetails());throw e;}}/*** 复制文件到目标目录下* @param documentId 目标docs* @param foldID 迁移目录* @param copyName 复制文件后的名字* @throws GeneralSecurityException* @throws IOException*/public static String copyDocs(String documentId,String foldID,String copyName) throws GeneralSecurityException, IOException {final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
//        Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES))
//                .setApplicationName(APPLICATION_NAME)
//                .build();Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES)).setApplicationName(APPLICATION_NAME).build();File copyMetadata = new File().setName(copyName);File documentCopyFile =service.files().copy(documentId, copyMetadata).execute();String documentCopyId = documentCopyFile.getId();moveFileToFolder(documentCopyId, foldID);return documentCopyId;}private static Docs getDocsService()  {final NetHttpTransport HTTP_TRANSPORT;Docs service;try {HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES)).setApplicationName(APPLICATION_NAME).build();} catch (GeneralSecurityException | IOException e) {throw new RuntimeException(e);}return service;}/*** 指定索引处插入文本* @param docsId* @param index 文字的索引 从0开始* @param text 插入文本* @throws IOException*/public static void updateDocs(String docsId, Integer index, String text) throws IOException {Docs service = getDocsService();List<Request> requests = new ArrayList<>();requests.add(new Request().setInsertText(new InsertTextRequest()
//                .setText("07.18~07.24").setText(text)
//                .setLocation(new Location().setIndex(2))));.setLocation(new Location().setIndex(index))));BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests);BatchUpdateDocumentResponse response = service.documents().batchUpdate(docsId, body).execute();System.out.println("updated: "+response.getDocumentId());}/*** 最末尾处插入空表格* @param docsId* @throws IOException*/public static void insertSheetInDocs(String docsId) throws IOException {Docs service = getDocsService();List<Request> requests = new ArrayList<>();requests.add(new Request().setInsertTable(new InsertTableRequest().setEndOfSegmentLocation(new EndOfSegmentLocation()).setRows(3).setColumns(3)));BatchUpdateDocumentRequest body =new BatchUpdateDocumentRequest().setRequests(requests);BatchUpdateDocumentResponse response =service.documents().batchUpdate(docsId, body).execute();}/*** docs中表格插入数据 必须倒着写不然索引会变(代码内已处理)* @param docsId 操作文档* @param indexOfTable 文档中第几个表* @param data 行数据* @param row 写入第几行数据 注意第一可能为标题* @throws IOException 表格若有数据会报错*/public static void updateDocsSheetRow(String docsId,Integer indexOfTable,List<Object> data,int row) throws IOException {Docs service = getDocsService();// 获取结构Document document = service.documents().get(docsId).execute();List<StructuralElement> tables = document.getBody().getContent().stream().filter(e -> e.getTable() != null).collect(Collectors.toList());if(indexOfTable>=tables.size()){throw new IllegalArgumentException("out of size");}// 获取tableStructuralElement table = tables.get(indexOfTable);// 拿到table行索引List<Integer> indexs = table.getTable().getTableRows().get(row).getTableCells().stream().map(TableCell::getStartIndex).collect(Collectors.toList());Collections.reverse(indexs);Collections.reverse(data);List<Request> requests = insertRowList(indexs, data);BatchUpdateDocumentRequest body =new BatchUpdateDocumentRequest().setRequests(requests);BatchUpdateDocumentResponse response = service.documents().batchUpdate(docsId, body).execute();}public static List<Request> insertRowList(List<Integer> reIndex,List<Object> rowData){int i=0;List<Request> rows=new ArrayList<>();for (Object e : rowData) {Request request = new Request().setInsertText(new InsertTextRequest().setText(String.valueOf(e)).setLocation(new Location().setIndex(reIndex.get(i++)+1)));rows.add(request);}
//        Collections.reverse(rows);return rows;}}

注释都有 凑活看看 下次详细讲解 拉取Grafana自动生成报表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【山河送书第七期】:《强化学习:原理与Python实战》揭秘大模型核心技术RLHF!

《强化学习&#xff1a;原理与Python实战》揭秘大模型核心技术RLHF&#xff01; 一图书简介二RLHF是什么&#xff1f;三RLHF适用于哪些任务&#xff1f;四RLHF和其他构造奖励模型的方法相比有何优劣&#xff1f;五什么样的人类反馈才是好反馈&#xff1f;六如何减小人类反馈带来…

web前端开发基础入门html5+css3+js学习笔记(一)

目录 1.第一个前端程序2.前端工具的选择与安装3.VSCode开发者工具快捷键4.HTML5简介与基础骨架4.1 HTML5的DOCTYPE声明4.2 HTML5基本骨架4.2.1 html标签4.2.2 head标签4.2.3 body标签4.2.4 title标签4.2.5 meta标签 5.标签之标题5.1 快捷键5.1 标题标签位置摆放 6.标签之段落、…

leetcode 377. 组合总和 Ⅳ

2023.8.17 本题属于完全背包问题&#xff0c;乍一看和昨天那题 零钱兑换II 类似&#xff0c;但细看题目发现&#xff1a;今天这题是排列问题&#xff0c;而“零钱兑换II”是组合问题。排列问题强调顺序&#xff0c;而组合顺序不强调顺序。 这里先说个结论&#xff1a;先遍历物品…

并查集、树状数组

并查集、树状数组、线段树 并查集树状数组树状数组1 (单点修改&#xff0c;区间查询)树状数组2 (单点查询&#xff0c;区间修改) 并查集 【模板】并查集 题目描述 如题&#xff0c;现在有一个并查集&#xff0c;你需要完成合并和查询操作。 输入格式 第一行包含两个整数 …

1.物联网LWIP网络,TCP/IP协议簇

一。TCP/IP协议簇 1.应用层&#xff1a;FTP&#xff0c;HTTP&#xff0c;Telent&#xff0c;DNS&#xff0c;RIP 2.传输层&#xff1a;TCP&#xff0c;UDP 3.网络层&#xff1a;IPV4&#xff0c;IPV6&#xff0c;OSPF&#xff0c;EIGRP 4.数据链路层&#xff1a;Ethernet&#…

YOLOv5改进系列(21)——替换主干网络之RepViT(清华 ICCV 2023|最新开源移动端ViT)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2

两阶段提交:详解数据库宕机引起的主从不一致问题、redolog与binlog的两阶段提交

0、基础知识and问题 从基础上我们了解&#xff1a; &#xff08;1&#xff09;redolog作为数据库保证持久化的日志&#xff0c;在update事务提交后就会按一定的策略刷入磁盘中&#xff0c;在刷入后&#xff0c;即使数据库断电宕机&#xff0c;mysql也能从redolog中恢复数据到磁…

Matplotlib数据可视化(六)

目录 1.绘制概率图 2.绘制雷达图 3.绘制流向图 4.绘制极坐标图 5.绘制词云图 1.绘制概率图 from scipy.stats import norm fig,ax plt.subplots() plt.rcParams[font.family] [SimHei] np.random.seed() mu 100 sigma 15 x musigma*np.random.randn(437) num_bins …

【腾讯云 Cloud Studio 实战训练营】在线 IDE 编写 canvas 转换黑白风格头像

关于 Cloud Studio Cloud Studio 是基于浏览器的集成式开发环境(IDE)&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 Cloud Studio 作为在线IDE&#xff0c;包含代码高亮、自动补全、Gi…

C++新经典03--共用体、枚举类型与typedef

共用体 共用体&#xff0c;也叫联合&#xff0c;有时候需要把几种不同类型的变量存放到同一段内存单元&#xff0c;例如&#xff0c;把一个整型变量、一个字符型变量、一个字符数组放在同一个地址开始的内存单元中。这三个变量在内存中占的字节数不同&#xff0c;但它们都从同…

idea 转换为 Maven Project 的方法

选项&#xff1a; Add as Maven Project

通过TightVNC远程访问MacOS

目录 一、下载 TightVNC 下载链接&#xff1a;https://www.tightvnc.com/ 下载后按步骤进行安装&#xff0c;安装完成后安装目录如下&#xff1a; 运行 tvnviewer.exe&#xff0c;输入远程 IP&#xff0c;点击【connect】&#xff1a; 输入密码&#xff0c;点击【OK】后即可远…

Matlab中图例的位置(图例放在图的上方、下方、左方、右方、图外面)等

一、图例默认位置 默认的位置在NorthEast r 10; a 0; b 0; t0:0.1:2.1*pi; xar*cos(t); ybr*sin(t); A1plot(x,y,r,linewidth,4);%圆 hold on axis equal A2plot([0 0],[1 10],b,linewidth,4);%直线 legend([A1,A2],圆形,line)二、通过Location对legend的位置进行改变 变…

企业电子招投标采购系统源码之电子招投标的组成 tbms

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为…

设计模式-观察者模式(观察者模式的需求衍变过程详解,关于监听的理解)

目录 前言概念你有过这样的问题吗&#xff1f; 详细介绍原理&#xff1a;应用场景&#xff1a; 实现方式&#xff1a;类图代码 问题回答监听&#xff0c;为什么叫监听&#xff0c;具体代码是哪观察者模式的需求衍变过程观察者是为什么是行为型 总结&#xff1a; 前言 在软件设计…

【C++类和对象】类有哪些默认成员函数呢?(下)

文章目录 一、类的6个默认成员函数二、日期类的实现2.1 运算符重载部分2.2 日期之间的运算2.3 整体代码1.Date.h部分2. Date.cpp部分 三. const成员函数四. 取地址及const取地址操作符重载扩展内容 总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡…

2011年下半年 软件设计师 上午试卷2

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

数据包如何游走于 Iptables 规则之间?

在前文《Linux路由三大件》中&#xff0c;我们提到了 iptables 可以修改数据包的特征从而影响其路由。这个功能无论是传统场景下的 防火墙&#xff0c;还是云原生场景下的 服务路由&#xff08;k8s service&#xff09;、网络策略(calico network policy) 等都有依赖。 虽然业…

ceph数据分布

ceph的存储是无主结构&#xff0c;数据分布依赖client来计算&#xff0c;有两个条主要路径。 1、数据到PG 2、PG 到OSD 有两个假设&#xff1a; 第一&#xff0c;pg的数量稳定&#xff0c;可以认为保持不变&#xff1b; 第二&#xff0c; OSD的数量可以增减&#xff0c;OSD的…

基于Java的深圳坂田附近闲置物品交易群管理系统

开发技术&#xff1a;java 开发框架&#xff1a;springmvc、spring、mybatis 数据库&#xff1a;mysql 备注&#xff1a;方便大家将手中的二手闲置物品转让给需要的人&#xff0c;例如大家搬家的时候&#xff0c;有不要的&#xff08;冰箱、洗衣机、桌子、椅子&#xff09;等物…