如何使用 API 格式化 Google 表格电子表格单元格?

Posted

技术标签:

【中文标题】如何使用 API 格式化 Google 表格电子表格单元格?【英文标题】:How can I format a Google Sheets spreadsheet cell with the API? 【发布时间】:2012-11-21 12:43:49 【问题描述】:

我的应用程序会生成一个数据表并在用户的 Google 云端硬盘中创建一个新的电子表格文档。如何向单个单元格添加格式(颜色、字体粗细、宽度等)?我似乎找不到任何文档,更不用说如何通过google-api-ruby-client 来实现它了。

我的大部分发现都可以追溯到 Google API 邮件列表,这些邮件列表声明它不受支持。 但是,我发现另一个应用程序实现了我想要的结果。将文档导出到 Google Drive 的“Smartsheet”示例:

来自 Smartsheet.com:

我的 Google Drive 中的结果表:

【问题讨论】:

【参考方案1】:

(2017 年 2 月) As of Google I/O 2016,开发人员不再需要导出到 Excel,也无需创建具有所需格式的新工作表,因此其他答案现在已过时。您现在可以使用Google Sheets API 格式化单元格。这是一个简短的 Python 示例,将第一行加粗(假设文件 ID 是 SHEET_ID 并且 SHEETS 是 API 服务端点):

DATA = 'requests': [
    'repeatCell': 
        'range': 'endRowIndex': 1,
        'cell':  'userEnteredFormat': 'textFormat': 'bold': True,
        'fields': 'userEnteredFormat.textFormat.bold',
    
]

SHEETS.spreadsheets().batchUpdate(
        spreadsheetId=SHEET_ID, body=DATA).execute()

如果有帮助的话,我还制作了一个关于这个主题的开发者视频(见下文)。顺便说一句,您可以在 Ruby(参见its API quickstart sample)或Google APIs Client Libraries 支持的任何其他语言中执行相同的操作。

Sheets API 提供了旧版本中不可用的功能,即让开发人员可以像使用用户界面一样以编程方式访问工作表(冻结行、单元格格式 [!]、调整行/列大小、添加数据透视表、创建图表等)。如果您是 API 新手,我制作了一些视频,其中包含更多“真实世界”示例:

Migrating SQL data to a Sheet 加码深潜 post Formatting text using the Sheets API 加代码深潜 post Generating slides from spreadsheet data 加代码深潜 post

要了解您可以通过其 REST API 或 Google Apps Script 使用 Google 表格做什么,请查看我的另一个 videos。如您所知,Sheets API 主要用于上述面向文档的功能,但执行文件级别的访问,例如导入/导出、复制、移动、重命名等,请改用Google Drive API。

【讨论】:

【参考方案2】:

Smartsheet 利用 Google API 的功能来导入 Excel 文件。代码大致如下:

DocsService client = new DocsService(<YOUR APP NAME>);
client.setOAuthCredentials(<OAUTH PARAMETERS>);

DocumentListEntry newEntry = new SpreadsheetEntry();
newEntry.setMediaSource(new MediaByteArraySource(<EXCEL FILE BYTE ARRAY OUTPUT STREAM>, DocumentListEntry.MediaType.XLS.getMimeType()));
newEntry.setTitle(new PlainTextConstruct(<FILE NAME>));

DocumentListEntry insertedEntry = client.insert(new URL("https://docs.google.com/feeds/default/private/full/"), newEntry);

// This is your URL to the new doc
String docUrl = insertedEntry.getDocumentLink().getHref();

我们已经能够通过 Apache POI 将 Smartsheet 导出为 Excel 文件并进行格式化。将导出添加到 Google 电子表格对我们来说实现起来非常简单,并且它提供了一些您无法通过 API 执行的额外功能。

抱歉,回复延迟 - 刚刚发生在这个问题上。

【讨论】:

【参考方案3】:

API 仅提供对数据的访问,不公开任何添加格式的方法。

【讨论】:

感谢您的回复。我知道没有记录的方法,但 Smartsheet 必须以某种方式做到这一点。也许是私有 API?也许不是你可以透露的。 这不再是真的。有关详细信息,请参阅我上面的答案。【参考方案4】:

另一个选项(也是最终使用的选项)是手动创建一个 Google 表格文件,并预先配置所有格式,作为模板。然后,不要在用户的 Google Drive 中创建新的电子表格文档,而是复制模板,如下所示:

var config = require('./config');
var google = require('googleapis');

function createSheetFromTemplate(user, templateFileId, done) 

  var oauth2Client = new google.auth.OAuth2(config.google.clientId, config.google.clientSecret);

  oauth2Client.setCredentials(
    access_token: user.google.token,
    refresh_token: user.google.refreshToken,
  );

  var drive = google.drive(
    version: 'v2',
    auth: oauth2Client
  );
  drive.files.copy(
    fileId: templateFileId,
    resource: 
      title: 'New Google Sheet',
      parents: [
        id: 'root'
      ]
    
  , function(err, response) 
    if (err) done(err)

    initializeSpreadsheet(response.id, user, done);
  );

在该代码中,templateFileId 是您共享模板的文件 ID。您可以通过多种方式从共享模板文件中获取此 fileId,但最简单的方法是在共享时将其从 URL 中复制并粘贴出来。

例如,如果分享网址是:

https://docs.google.com/spreadsheets/d/1234567890abcdefghijklmnop/edit?usp=sharing

那么文件id就是1234567890abcdefghijklmnop

在我的例子中,模板本身没有任何私有内容,所以我只是与配置为“可以查看”的“任何知道链接的人”共享它,如下所述:

https://support.google.com/drive/answer/2494886

如果您需要将模板文件的内容保密,那么您需要找到某种方法来确保 config.google.clientId 指定的帐户可以访问它。

希望有帮助!

【讨论】:

【参考方案5】:

如果像我一样,上传预先格式化的 Excel 工作表还不够,那么 Google Apps 脚本看起来可能是不错的选择。 Range 类专门允许您操作至少一些您所询问的格式。

https://developers.google.com/apps-script/reference/spreadsheet/range

setFontColor() 和 setFontWeight() 在那里,但我还不知道单元格宽度的任何内容。

重要的是,我还没有弄清楚如何将 Google Apps 脚本绑定到我正在使用 Google Drive API SDK(在我的情况下为 Node/javascript,在你的情况下为 Ruby)创建的工作表上。

https://developers.google.com/apps-script/guides/bound

您的问题已经有一段时间了,所以我打赌您已经通过其他方式解决了它。我也不一定建议将您应用程序中的所有内容都移植到 Google Apps Script(尽管我自己也在认真考虑...),但如果您或其他读者知道如何将 Google App Script 绑定到电子表格使用 google-api-ruby-client,您可能会很好。

【讨论】:

以上是关于如何使用 API 格式化 Google 表格电子表格单元格?的主要内容,如果未能解决你的问题,请参考以下文章

使用 google 电子表格 API 仅删除单元格范围选择的格式

如何使用Google表格Api V4格式化检索工作表数据

从Google电子表格中解析格式化文本

如何在 PHP 中访问 Google 电子表格 API?

Google Sheets API:创建电子表格或将电子表格移动到文件夹中

无法访问通过 Google 电子表格 API 通过服务帐户创建的工作表