Edited at

Google Sheets API v4「1セル 50000文字までの制限あるよ」

@koshi_life です。

タイトルのままです。

スプレッドシートの1セルに50000文字以上の値を書き込む可能性があるなら、

スプレッドシートに書き込む前に50000文字以内にしてから書き込む もしくは エラーキャッチするなりしようという話です。

エラーメッセージも日本語でわかりやすく表示されていますが、公式ドキュメントに見当たらない制約だったので備忘します。


スタックトレース

$ bundle exec ruby update_sheets.rb 

Traceback (most recent call last):
16: from update_sheets.rb:18:in `<main>'
15: from [project]/vendor/bundle/ruby/2.6.0/gems/google_drive-3.0.2/lib/google_drive/worksheet.rb:425:in `s
ave'
14: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/generated/google/apis/sheets_v4/s
ervice.rb:789:in `update_spreadsheet_value'
13: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/base_service
.rb:360:in `execute_or_queue_command'
12: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/http_command
.rb:102:in `execute'
11: from [project]/vendor/bundle/ruby/2.6.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
10: from [project]/vendor/bundle/ruby/2.6.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
9: from [project]/vendor/bundle/ruby/2.6.0/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable
'
8: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/http_command
.rb:110:in `block in execute'
7: from [project]/vendor/bundle/ruby/2.6.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
6: from [project]/vendor/bundle/ruby/2.6.0/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
5: from [project]/vendor/bundle/ruby/2.6.0/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
4: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/http_command.rb:113:in `block (2 levels) in execute'
3: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/http_command.rb:310:in `execute_once'
2: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/http_command.rb:193:in `process_response'
1: from [project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/api_command.rb:116:in `check_status'
[project]/vendor/bundle/ruby/2.6.0/gems/google-api-client-0.28.6/lib/google/apis/core/http_command.rb:228:in `check_status': badRequest: 入力内容が 1 つのセルに最大 50000 文字の制限を超えています。 (Google::Apis::ClientError)


検証コード


update_sheets.rb

require 'google_drive'

# 指定の文字列長の文字列を生成します。
def generate_rand_text(length: 100)
text = []
(1..length).each { |index| text << index % 10 }
text.join('')
end

session = GoogleDrive::Session.from_config('config.json')

sheets_id = 'xxx_xxx_xxx'
sheets = session.spreadsheet_by_key(sheets_id)

worksheet = sheets.worksheets[0]
value = generate_rand_text(length: 50001) # NG
#value = generate_rand_text(length: 50000) # OK
#value = generate_rand_text(length: 50001)[0, 50000] # OK (50000文字以降は切り捨てればOK)
worksheet[1, 1] = value
worksheet.save


google-drive-ruby ライブラリの使い方は前回記事を参照。

RubyでGoogle Drive/スプレッドシートを扱う


参考

GoogleAppsScript(GAS)でのcacheあれこれ

にも制限に関する記述あり。


Cache.gs

// ※1セル50000文字までという制限があるため