当前位置: 首页 > 知识库问答 >
问题:

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

巫朝明
2023-03-14

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

基本上,我正在尝试做以下工作:

  • 有一个电子表格,我想对其进行小的更改。
  • 创建一个新的电子表格,将模板中的所有表格逐个复制到新的电子表格中(电子表格复制会更有效率)

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

尝试了两种方法:

角:

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

给出以下错误:

对飞行前请求的响应未通过访问控制检查:无“访问控制允许原点”

Google Sheets Api调用:

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

请求顺利通过。但是,新创建的电子表格没有复制工作表。

共有3个答案

潘衡
2023-03-14

这个问题很老,但是谈到最新的Sheets API v4,您需要Request estBody字段才能复制工作表。

sheets.spreadsheets.sheets.copyTo({
    spreadsheetId: fromSpreadsheetId,
    sheetId: fromSheetId,
    requestBody: {
        destinationSpreadsheetId: destinationSpreadsheetId
    }
})

检查文档,但请注意,在它们的示例中,它们使用资源而不是请求主体。我正在使用TypeScript,并且我使用资源遇到了类型错误。

这里有一个TypeScript示例Changed docs的示例,其中我在同一个电子表格中复制了一张工作表(对于复制,还可以使用batchUpdate处理复制请求)。

js lang-js prettyprint-override">const request: sheets_v4.Params$Resource$Spreadsheets$Sheets$Copyto = {
  // The ID of the spreadsheet containing the sheet to copy.
  spreadsheetId: '9MhcPzrWE-Pv9MKhJwow6cWi9uO46RcDTfxhvT9X1fY',
  // The ID of the sheet to copy.
  sheetId: 3,
  requestBody: {
    // The ID of the spreadsheet to copy the sheet to.
    destinationSpreadsheetId: '9MhcPzrWE-Pv9MKhJwow6cWi9uO46RcDTfxhvT9X1fY'
  }
};

try {
  const response = (await this.sheets.spreadsheets.sheets.copyTo(request)).data;
  console.log(JSON.stringify(response, null, 2));
} catch (err) {
  console.error(err);
}
仉姚石
2023-03-14

我也遇到过这个问题,所以正如前面所写的那样,最好也是唯一正确的方法就是使用驱动API的文件。复制方法。以下是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()code:

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',
        ]
    );
}
丁宏浚
2023-03-14

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

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

1) 使用驱动器API的文件。复制方法。驱动器API中的文件ID与工作表API中的电子表格ID等效。

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

 类似资料:
  • 可编辑链接-https://docs.google.com/spreadsheets/d/1vrzchTHVwwzc9wgFGmtc_zBsh27CEtE7KOyeNDuLwC0/edit?usp=sharing 发布至网页-https://docs.google.com/spreadsheets/d/e/2PACX-1vRaJd3YpKnemAneU47RI58m7cxQsYFdViFBxJPV

  • 我是谷歌脚本的新手,不知道是否有人能帮我。 我有一个共享的谷歌电子表格,基本上是用新的员工信息更新行。 我希望只有当插入这些新员工行时,特定列(比如F列)上的“ABC”字符串匹配时,才会触发电子邮件。基本上,电子邮件触发器会让我们的团队知道如何设置新的员工帐户。 有人能帮我吗?我不知道如何进行字符串匹配,也不知道如何让它专门发送给固定的电子邮件收件人。我已经安装了Python、gspread和gd

  • 我正在阅读Java快速入门中描述的谷歌电子表格 https://developers.google.com/sheets/quickstart/java 快速入门说明了如何从给定范围读取数据 如你所见,我从回复中读取了双重值 我希望双值的专用格式(例如,12,34而不是12.34) 我是否可以将期望的数字格式作为参数传递给请求?比如: 问候 迈克尔

  • 我可以通过标签索引而不是标签标题或标签标识查询我的电子表格标签吗? https://sheets.googleapis.com/v4/spreadsheets/{我的工作表id}/值/'英雄视频拷贝部分'?key={秘密代码} “Hero Video Copy Section”是该选项卡的标题,但我想通过索引查找该选项卡。

  • 我正在测试新的谷歌电子表格,因为我真的需要一个新功能:200张的限制已经取消(更多信息:https://support.google.com/drive/answer/3541068)。 但是,我不能像旧版本那样将电子表格发布到CSV。我去“档案室” 发布的“不支持的功能”文档中未提及此限制,该文档位于:https://support.google.com/drive/answer/3543688

  • B页中有图表,其中有源数据。我想以这样一种方式将图表导入到主电子表格B中,当图表在表格B中更改时,它也应该在主表格A中动态更改。 经过大量的研究,我能够找到以下内容: Importrange-只导入数据,而不是图表 复制图表本身并将其粘贴到主工作表A,但当图表在工作表B中动态变化时,它不会更改。 发布图表并将URL作为图像插入-如果主表A是google电子表格,则不起作用,但适用于google文档