Google表格Api:复制谷歌电子表格

时间:2016-12-20 17:05:06

标签: javascript angularjs google-sheets-api

尝试复制整个电子表格,但我想没有api可以这样做。

基本上,我正在努力做到以下几点:

  • 有一个我希望复制的电子表格,只需进行细微更改。
  • 创建新的电子表格,将所有工作表从模板逐个​​复制到新的电子表格中(电子表格副本效率会更高)

创建新的电子表格可以正常工作,但是从电子表格复制工作表不起作用。

尝试了两种方式:

角:

$http.post("https://sheets.googleapis.com/v4/spreadsheets/"+fromSpreadsheetId+"/sheets/"+fromSheetId,
                            {headers: {
                        'Authorization': 'Bearer ' + this.oauthToken
                     }},

给出以下错误:

  

对预检请求的响应未通过访问控制检查:否'Access-Control-Allow-Origin'

Google表格Api电话:

gapi.client.sheets.spreadsheets.sheets.copyTo({spreadsheetId: fromSpreadsheetId , sheetId: fromSheetId},{destinationSpreadsheetId: destinationSpreadsheetId});

请求没有任何错误。但是,新创建的电子表格没有复制工作表。

2 个答案:

答案 0 :(得分:5)

您可能想要专门针对CORS问题提出单独的问题,因为这是一个单独的问题。

关于“复制电子表格”,您有两种选择:

1)使用Drive API的files.copy方法。 Drive API中的=""相当于Sheets API中的apply('="{}".format)

2)请勿使用您复制的“模板”电子表格。而是使用Sheet API的spreadsheets.create方法。您可以使用spreadsheets.get检索“模板”JSON,并可以在创建新电子表格之前根据需要进行调整。

答案 1 :(得分:1)

我也遇到过这个问题,所以就像之前写的那样,最好的,也许是唯一正确的方法是使用 Drive API 的 files.copy 方法。这是 PHP 示例,您可以这样做:

function copySpreadSheet(string $spreadsheetId, string $title, string email) {
    $serviceSheets = new Google_Service_Sheets(getGoogleClient());
    $serviceDrive = new Google_Service_Drive(getGoogleClient());

    $fileCopy = $serviceDrive->files->copy($spreadsheetId, new Google_Service_Drive_DriveFile());
    insertPermission($serviceDrive, $fileCopy->getId(), $email, 'user', 'owner');
    $requests = [
        'updateSpreadsheetProperties' => [
            'properties' => [
                'title'         => $title,
            ],
            'fields' => 'title'
        ]
    ];
    $requestBody = new Google_Service_Sheets_BatchUpdateSpreadsheetRequest([
        'requests' => $requests,
    ]);
    $response = $serviceSheets->spreadsheets->batchUpdate($fileCopy->getId(), $requestBody);

    return $serviceSheets->spreadsheets->get($fileCopy->getId());
}

如有必要,这里是 insertPermission() 代码:

function insertPermission(Google_Service_Drive $service, string $fileId, string $email, string $type, string $role) {
    $newPermission = new Google_Service_Drive_Permission([
        'type' => $type,
        'role' => $role,
        'emailAddress' => $email,
    ]);
    return $service->permissions->create($fileId, $newPermission, [
            'fields' => 'id',
            'transferOwnership' => 'true',
        ]
    );
}