Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过Google服务帐户PHP访问Google sheets

通过Google服务帐户PHP访问Google sheets
EN

Stack Overflow用户
提问于 2020-11-25 10:08:45
回答 2查看 612关注 0票数 0

我是Google API的新手,也是PHP的新手。我知道有一些类似的问题,但在过去的几天里,我都没能处理好我的问题。

我正在构建一个从google sheets读取和写入的应用程序,并使用一个简单的API密钥与公共工作表,我能够阅读没有问题。不过,我还是没弄清楚Service帐户的授权。

我已将工作表设置为私有,并授权服务帐户电子邮件地址编辑者访问工作表。

我反复检查了client_id,电子邮件地址,工作表id。

下面是我的代码:

代码语言:javascript
运行
AI代码解释
复制
function update_stat($spreadsheet_range)
{
    session_start();
    $client_id = 'XXXXXXXXXX';
    $email_address = 'xxx@xxxx.iam.gserviceaccount.com';

    $service_account_file = __DIR__ . '/sheetsCS.json';
    $spreadsheet_id = 'xxxxxxxxxxxxxxxxxxxxxx';
    putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $service_account_file);
    date_default_timezone_set("Europe/Rome");

    $client = new Google_Client();
    $client->useApplicationDefaultCredentials();
    $client->setScopes(Google_Service_Sheets::SPREADSHEETS);
    $service = new Google_Service_Sheets($client);

    $result = $service->spreadsheets_values->get($spreadsheet_id, $spreadsheet_range);
    return $result;
}

无论我尝试什么,我都会得到以下错误:

代码语言:javascript
运行
AI代码解释
复制
[25-Nov-2020 09:22:07 Europe/Rome] PHP Fatal error:  Uncaught Google\Service\Exception: {"error":"invalid_grant","error_description":"Invalid JWT Signature."} in /home/usedbott/public_html/wp-content/themes/ubl-custom-theme/stat-interface/vendor/google/apiclient/src/Http/REST.php:128
Stack trace:
#0 /home/usedbott/public_html/wp-content/themes/ubl-custom-theme/stat-interface/vendor/google/apiclient/src/Http/REST.php(103): Google\Http\REST::decodeHttpResponse(Object(GuzzleHttp\Psr7\Response), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...')
#1 [internal function]: Google\Http\REST::doExecute(Object(GuzzleHttp\Client), Object(GuzzleHttp\Psr7\Request), 'Google_Service_...')
#2 /home/usedbott/public_html/wp-content/themes/ubl-custom-theme/stat-interface/vendor/google/apiclient/src/Task/Runner.php(181): call_user_func_array(Array, Array)
#3 /home/usedbott/public_html/wp-content/themes/ubl-custom-theme/stat-interface/vendor/google/apiclient/src/Http/REST.php(66): Google\Task\Runner->run()
#4 /home/usedbott/public_html/wp-content/themes/ubl-custom-theme/stat-int in /home/usedbott/public_html/wp-content/themes/ubl-custom-theme/stat-interface/vendor/google/apiclient/src/Http/REST.php on line 128

为了让它工作,我错过了什么?

EN

回答 2

Stack Overflow用户

发布于 2020-11-25 15:29:24

您可能还想查看此快速入门指南,了解PHP https://developers.google.com/sheets/api/quickstart/php中的Google Sheets API

内容:

  1. 有关如何启用谷歌工作表应用编程接口
  2. 如何安装谷歌客户端库
  3. 设置示例代码的指南
  4. 运行示例代码

<代码>G210

示例代码:

代码语言:javascript
运行
AI代码解释
复制
<?php
require __DIR__ . '/vendor/autoload.php';

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Sheets API PHP Quickstart');
    $client->setScopes(Google_Service_Sheets::SPREADSHEETS_READONLY);
    $client->setAuthConfig('credentials.json');
    $client->setAccessType('offline');
    $client->setPrompt('select_account consent');

    // Load previously authorized token from a file, if it exists.
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // If there is no previous token or it's expired.
    if ($client->isAccessTokenExpired()) {
        // Refresh the token if possible, else fetch a new one.
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            // Request authorization from the user.
            $authUrl = $client->createAuthUrl();
            printf("Open the following link in your browser:\n%s\n", $authUrl);
            print 'Enter verification code: ';
            $authCode = trim(fgets(STDIN));

            // Exchange authorization code for an access token.
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

            // Check to see if there was an error.
            if (array_key_exists('error', $accessToken)) {
                throw new Exception(join(', ', $accessToken));
            }
        }
        // Save the token to a file.
        if (!file_exists(dirname($tokenPath))) {
            mkdir(dirname($tokenPath), 0700, true);
        }
        file_put_contents($tokenPath, json_encode($client->getAccessToken()));
    }
    return $client;
}


// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Sheets($client);

// Prints the names and majors of students in a sample spreadsheet:
// https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
$spreadsheetId = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms';
$range = 'Class Data!A2:E';
$response = $service->spreadsheets_values->get($spreadsheetId, $range);
$values = $response->getValues();

if (empty($values)) {
    print "No data found.\n";
} else {
    print "Name, Major:\n";
    foreach ($values as $row) {
        // Print columns A and E, which correspond to indices 0 and 4.
        printf("%s, %s\n", $row[0], $row[4]);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-12-23 10:23:29

我也会感兴趣的。我可以让quickstart.php在本地主机上运行,但是当我将供应商文件夹、credentials.json和token.json文件传输到(共享)服务器时,setAuthConfig()函数会失败。我已经在本地运行了Composer,然后通过FTP上传了它-这种方法真的有效吗?是,供应商文件夹的权限设置为755。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65002484

复制
相关文章
Java之方法重载篇(我重载了,你要如何来调用我。。)
4. ## 如何调用?    由课前引言中的示例可知,调用具有“重载关系”的方法时,传递的实参类型决定了所调用的方法。    当实参类型是整型,那么系统会相应的调用形参同样是整型的int square(int x)方法;当实参类型是浮点型,那么系统会相应的调用形参同样是整型的int square(double y)方法;    方法调用跟形参变量名(x,y)没有关系,与形参类型有关。
CN_Simo
2022/05/10
2750
Java之方法重载篇(我重载了,你要如何来调用我。。)
Android如何调用so文件
下面通过一个安卓调用C++代码打印字符串的实例介绍一下在Android Studio中使用最新的编译方式编译出so文件的步骤。
用户5521279
2020/03/05
10.6K0
Android如何调用so文件
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
调用 jclass GetObjectClass(jobject obj) 或 jclass FindClass(const char* name) 方法 , 获取 jclass 类型变量 ;
韩曙亮
2023/03/27
8.6K0
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
Android调用相机与相册的方法
Android调用相机与相册的方法 操作流程 点击拍摄 效果图 点击相册选择 效果图 拒绝权限的情况 效果图 功能实现 项目配置 1.先在项目根目录的build.gradle的repositories添加: 2.在build.gradle(:app)的dependencies添加: 3.添加提示dialog样式 4.添加底部dialog样式 底部dialog弹出动画(dialog_in_anim.xml) 底部dialog关闭动画(dialog_out_anim.xml) 5.添加权限 6.在Android
是阿超
2022/08/07
2K0
Android调用相机与相册的方法
Android如何调用摄像头
第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限,所以第一步,我们应该在Android清单文件中加入以下代码
黄啊码
2020/05/29
1.5K0
android 从相册选择图片_android调用相册并显示图片
public class MainActivity extendsAppCompatActivity {int REQUEST_CODE = 0;privateNineGridImageView ngiv;private ArrayListphotos;privateDialog dialog;privatecn.com.jwtimes.www.jwtimes.mAdapter mAdapter1;
全栈程序员站长
2022/11/08
1.7K0
Spring杂谈 | 从桥接方法到JVM方法调用
这些代码对我之前也造成了不小疑惑,在彻底弄懂后通过本文分享出来,也能减少大家在阅读代码过程中的障碍!
程序员DMZ
2020/07/06
1.6K0
android-fragment-重新显示调用的方法
@Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (!hidden) { getUserInfo(UserManager.getManager(getContext()).getUserId()); } }
tea9
2022/07/16
4070
AllJoyn+Android开发案例-android跨设备调用方法
项目需要涉及AllJoyn开源物联网框架。前面主要了解了一些AllJoyn基本的概念,像总线,总线附件,总线对象,总线接口这样的概念,以及之间的关系和跨设备、平台的调用功能。项目最终的目的实现是,跨平台的方法调用如:windows调用android,以及对于设备事件的订阅功能。
全栈程序员站长
2022/06/25
4480
AllJoyn+Android开发案例-android跨设备调用方法
java 异步调用方法_java异步调用方法有哪些?如何实现异步调用?
大家好,又见面了,我是你们的朋友全栈君。 你知道java异步调用方法都有哪些吗?下面的文章内容,就对这方面的问题做了一下整理,一起来看看java异步调用的方法吧! 1、利用Spring的异步方法去执行
全栈程序员站长
2022/09/14
4K0
如何通过反射调用对象的方法?
import java.lang.reflect.Method; class MethodInvokeTest { public static void main(String[] args) throws Exception { String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str));
唐怀瑟
2018/08/30
2.9K0
Android JNI 调用时缓存字段和方法 ID
在 JNI 去调用 Java 的方法和访问字段时,最先要做的操作就是获得对应的类以及对应的方法 id。
音视频开发进阶
2019/07/26
1.1K0
点击加载更多

相似问题

如何从Android调用RESTful方法?

16

Android:如何从服务中调用方法

110

如何从android库类调用方法

43

如何从AngularJS指令调用Android方法?

12

android:如何从超链接调用方法

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档