【问题标题】:Creating a Google Sheet in a specific folder with DriveApp使用 DriveApp 在特定文件夹中创建 Google 表格
【发布时间】:2020-01-29 00:35:01
【问题描述】:

我想使用 Google Apps 脚本在 Google Drive 上的特定文件夹中创建一个 Google Sheet。根据File类的documentation

createFile(名称、内容、mimeType)

在当前文件夹中创建一个具有给定名称、内容和 MIME 类型的文件。如果内容大于 10MB,则引发异常。

// Create an HTML file with the content "Hello, world!"
DriveApp.getRootFolder().createFile('New HTML File', '<b>Hello, world!</b>', MimeType.HTML);

并根据MimeTypedocumentation

枚举 MimeType

提供对 MIME 类型声明的访问而无需显式键入字符串的枚举。期望将 MIME 类型呈现为字符串(例如,'image/png')的方法也接受以下任何值,只要该方法支持基础 MIME 类型。

没有提到 createFile 仅支持可用 MIME 类型的子集。该页面包含一个表,其中包含此 MIME 类型:

GOOGLE_SHEETS Enum Representation of MIME type for a Google Sheets file.

我的问题在于按照File 文档中的描述实现这种创建文件的方法。

var folder = DriveApp.createFolder('new folder');
var ss = folder.createFile('new sheet', '', MimeType.GOOGLE_SHEETS);

这会抛出一个错误,说明

无效参数:file.contentType(第 2 行,文件“代码”)

用字符串application/vnd.google-apps.spreadsheet 替换MimeType.GOOGLE_SHEETS 显然没有帮助。我知道this question,但接受的答案只是承认失败,并通过在SpreadsheetApp 中创建文件、复制并删除原始文件来使用常见的混乱解决方法。 This question 对同一问题有一个同样令人失望的公认答案,但 Google Docs 除外。 SpreadsheetApp 的解决方法很好,但我希望 3 年后有人知道如何正确使用 createFile

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:

试试这个:

function createFolderAndFile() {
  var folder = DriveApp.createFolder('RootSub');
  var file = SpreadsheetApp.create('RootSubSheet');
  Drive.Files.update({"parents": [{"id": folder.getId()}]}, file.getId());
}

【讨论】:

  • 这比复制和删除解决方案要好,但仍然没有回答为什么谷歌认可的MimeType 方法不起作用。如果没有其他人回答,我会接受它,因为这是一个很好的解决方案。谢谢
  • 您也许可以在问题跟踪器上找到答案,该链接位于支持页面中。
【解决方案2】:

Google 问题跟踪器提出这个问题的历史由来已久。早在 2014 年,Google 工作人员 declared 就认为这是一个已解决的问题,他们认为 MimeType.GOOGLE_ 类型的文件无法通过 createFile 方法创建。

标记为已修复。

经过广泛考虑,我们确定 DriveApp.createFile() 不应用于创建 MimeType.GOOGLE_* 文件。

简而言之,尝试这样做会失败,并导致出现更具描述性的错误消息。

不幸的是,尽管有其他承诺,但错误消息从未更改,文档也从未更新以反映这种“广泛考虑”。

使用 1 个服务器调用(不复制、删除或更新)将 MimeType.GOOGLE_-type 文件添加到特定文件夹的正确解决方案是

var folder = DriveApp.createFolder('folder');
var file = {
    title: 'New Sheet',
    mimeType: MimeType.GOOGLE_SHEETS,
    parents: [{id: folder.getId()}]
}
ssId = Drive.Files.insert(file).id;

Drive.Files.insert 确实需要Advanced Drive Service,您可以使用this 指南在您的脚本上启用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多