Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google Sheets API-使用PHP插入一行_Php_Google Sheets - Fatal编程技术网

Google Sheets API-使用PHP插入一行

Google Sheets API-使用PHP插入一行,php,google-sheets,Php,Google Sheets,所以我创建了一个电子表格类,它是我在网上找到的几个用PHP访问GoogleSheetsAPI的解决方案的组合。它起作用了 class Spreadsheet { private $token; private $spreadsheet; private $worksheet; private $spreadsheetid; private $worksheetid; private $client_id = '<client id>'

所以我创建了一个电子表格类,它是我在网上找到的几个用PHP访问GoogleSheetsAPI的解决方案的组合。它起作用了

class Spreadsheet {
    private $token;
    private $spreadsheet;
    private $worksheet;
    private $spreadsheetid;
    private $worksheetid;

    private $client_id = '<client id>';
    private $service_account_name = '<service_account>';  // email address
    private $key_file_location = 'key.p12'; //key.p12

    private $client;
    private $service;

    public function __construct() {
        $this->client = new Google_Client();
        $this->client->setApplicationName("Sheets API Testing");
        $this->service = new Google_Service_Drive($this->client);
        $this->authenticate();
    }
    public function authenticate()
    {
        if (isset($_SESSION['service_token'])) {
            $this->client->setAccessToken($_SESSION['service_token']);
        }
        $key  = file_get_contents($this->key_file_location);
        $cred = new Google_Auth_AssertionCredentials(
            $this->service_account_name,
            array('https://www.googleapis.com/auth/drive', 'https://spreadsheets.google.com/feeds'),            $key
        );
        $this->client->setAssertionCredentials($cred);
        if ($this->client->getAuth()->isAccessTokenExpired()) {
            $this->client->getAuth()->refreshTokenWithAssertion($cred);
        }
        $_SESSION['service_token'] = $this->client->getAccessToken();

        // Get access token for spreadsheets API calls
        $resultArray = json_decode($_SESSION['service_token']);
        $this->token = $resultArray->access_token;
    }

    public function setSpreadsheet($title) {
        $this->spreadsheet = $title;
        return $this;
    }
    public function setSpreadsheetId($id) {
        $this->spreadsheetid = $id;
        return $this;
    }
    public function setWorksheet($title) {
        $this->worksheet = $title;
        return $this;
    }
    public function insert() {
        if (!empty($this->token)) {
            $url = $this->getPostUrl();
        } else {
            echo "Authentication Failed";
        }
    }
    public function add($data) {
        if(!empty($this->token)) {
            $url = $this->getPostUrl();
            if(!empty($url)) {
                $columnIDs = $this->getColumnIDs();
                if($columnIDs) {
                    $fields = '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">';
                    foreach($data as $key => $value) {
                        $key = $this->formatColumnID($key);
                        if(in_array($key, $columnIDs)) {
                            $fields .= "<gsx:$key><![CDATA[$value]]></gsx:$key>";
                        }
                    }
                    $fields .= '</entry>';

                    $headers = [
                        "Authorization" => "Bearer $this->token", 
                        'Content-Type' => 'application/atom+xml'
                    ];
                    $method = 'POST';
                    $req = new Google_Http_Request($url, $method, $headers, $fields);
                    $curl = new Google_IO_Curl($this->client);
                    $results = $curl->executeRequest($req);
                    var_dump($results);
                }
            }
        }
    }
    private function getColumnIDs() {
        $url = "https://spreadsheets.google.com/feeds/cells/" . $this->spreadsheetid . "/" . $this->worksheetid . "/private/full?max-row=1";
        $headers = array(
            "Authorization" => "Bearer $this->token",
            "GData-Version: 3.0"
        );

        $method = "GET";
        $req = new Google_Http_Request($url, $method, $headers);
        $curl = new Google_IO_Curl($this->client);
        $results = $curl->executeRequest($req);

        if($results[2] == 200) {

            $columnIDs = array();
            $xml = simplexml_load_string($results[0]);
            if($xml->entry) {
                $columnSize = sizeof($xml->entry);
                for($c = 0; $c < $columnSize; ++$c) {
                    $columnIDs[] = $this->formatColumnID($xml->entry[$c]->content);
                }
            }
            return $columnIDs;
        }
        return "";
    }
    private function getPostUrl() {
        if (empty($this->spreadsheetid)){

            #find the id based on the spreadsheet name
            $url = "https://spreadsheets.google.com/feeds/spreadsheets/private/full?title=" . urlencode($this->spreadsheet);
            $method = 'GET';
            $headers = ["Authorization" => "Bearer $this->token"];
            $req = new Google_Http_Request($url, $method, $headers);
            $curl = new Google_IO_Curl($this->client);
            $results = $curl->executeRequest($req);          

            if($results[2] == 200) {
                $spreadsheetXml = simplexml_load_string($results[0]);
                if($spreadsheetXml->entry) {
                    $this->spreadsheetid = basename(trim($spreadsheetXml->entry[0]->id));
                    $url = "https://spreadsheets.google.com/feeds/worksheets/" . $this->spreadsheetid . "/private/full";
                    if(!empty($this->worksheet)) {
                        $url .= "?title=" . $this->worksheet;
                    }
                    $req = new Google_Http_Request($url, $method, $headers);
                    $response = $curl->executeRequest($req);

                    if($response[2] == 200) {
                        $worksheetXml = simplexml_load_string($response[0]);
                        if($worksheetXml->entry) {
                            $this->worksheetid = basename(trim($worksheetXml->entry[0]->id));
                        }
                    }
                }
            }           
        }


        if(!empty($this->spreadsheetid) && !empty($this->worksheetid)) {
            return "https://spreadsheets.google.com/feeds/list/" . $this->spreadsheetid . "/" . $this->worksheetid . "/private/full";
        }

        return "";
    }
    private function formatColumnID($val) {
        return preg_replace("/[^a-zA-Z0-9.-]/", "", strtolower($val));
    }
}

有了它,我可以删除一行/更新一行并追加一行。然而,我需要它的主要原因是插入一行。有没有人想出一个办法?任何语言都可以,尽管我更喜欢php解决方案

您可以使用HTTPS GET或POST请求从PHP调用应用程序脚本独立脚本。PHP可以发出GET或POST请求,而Apps脚本显然可以使用
SpreadsheetApp
服务将行插入任何位置。您可能还希望在应用程序脚本代码中使用Content Service,以获得代码已完成的返回确认

您可能希望使用POST请求来提高安全性。所以,同样,您可以使用Apps脚本作为PHP和电子表格之间的中介。应用程序脚本文件中的
doPost()
将需要一个事件处理程序,通常分配给字母“e”:

此外,请参见以下答案:


您是否看过Sheets API中“添加列表行”的文档?在“协议”选项卡下查找,并查看POST请求。“API立即在列表提要中出现的最后一行之后插入新行,即刻在第一个完全空白行之前。”我想在电子表格的中间插入一行。但是当我查看它时,它说我不能使用服务帐户来做这件事。它说我只能用OAuth 2.0令牌与个人的私有用户数据交互。你是怎么做到的?
$Spreadsheet = new Spreadsheet();
$Spreadsheet->
    setSpreadsheet("test spreadsheet")->
    setWorksheet("Sheet1")->
    add(array("name" => "Cell 1", "email" => "Cell 2"));
doPost(e) {
  //Get e and retrieve what the code should do

  //Insert the row

};