質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5104閲覧

pythonのgspreadでスプレッドシートの関数を残したい

Yuiti628

総合スコア71

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/04 10:02

編集2020/10/04 10:59

###問題点
pythonのgspreadを使ってスプレッドシートを操作しています。

シートに関数が既にあり、その関数は消したくありません。

下記のようなコードで、実行すると関数が全て無くなり、その時の文字列に変わります。
何かオプションのようなものはないでしょうか?

# python # 2次元配列に整形 def _cellsto2darray(cells, col): # colは列の数 cells2d = [] for i in range(len(cells) // col): cells2d.append(cells[i * col:(i + 1) * col]) return cells2d # 1次元配列に整形 def _cellsto1darray(cells2d): cells1d = [] for cells in cells2d: cells1d.extend(cells) return cells1d # シート取得 worksheet = workbook.worksheet('XXXXXXXXX') # 全てのセルの値を取得 all_values = worksheet.get_all_values() cell_list = worksheet.range(1 , 1 , len(all_values) , len(all_values[0])) cell_list = _cellsto2darray(cell_list , len(all_values[0])) # all_valuesと同じ形にする for row in cell_list: # 条件とかを記入して値をいれる row[0].value = row[0].value =1 worksheet.update_cells(_cellsto1darray(cell_list)) #シートに記入

備考:

worksheet.update_cells(_cellsto1darray(cell_list),value_input_option='USER_ENTERED')
USER_ENTEREDを使って見てもダメでした。
これは、シートに関数を入れた時に有効でした。
row[0].value = '=sum(B2:C2)'

ちなみに、関数の入っているセルの値を見ると式では文字列が入っていました。

シート

ご指摘をいただき追加

やりたいこととしましては、シートBのシートAの参照部分の関数を消したくありません。

シートA

ABCD
1101
1201
1311
1411
1521
1621
1731
1831

シートB

ABCD
='シートA'!$A1000
='シートA'!$A2000
='シートA'!$A3010
='シートA'!$A4010
='シートA'!$A5020
='シートA'!$A6020
='シートA'!$A7030
='シートA'!$A8030

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nto

2020/10/04 10:49

簡易的で構いませんので、シート内のデータをお伺いしても宜しいでしょうか?
Yuiti628

2020/10/04 10:59

ご指摘をありがとうございます。 シートの部分を追加いたしました。
guest

回答1

0

ベストアンサー

原因としてはget_all_values()ではデフォルトでセルの値のみが取得出来るものとなります。
従って、オプションにvalue_render_optionFORMULAに指定してあげる事で数式が取得できます。

python

1all_values = worksheet.get_all_values(value_render_option='FORMULA') 2print(all_values) 3 4> [["='シートA'!$A1", 0, 0, 0], ["='シートA'!$A2", 0, 0, 0], ["='シートA'!$A3", 0, 1, 0], 5> ["='シートA'!$A4", 0, 1, 0], ["='シートA'!$A5", 0, 2, 0], ["='シートA'!$A6", 0, 2, 0], 6> ["='シートA'!$A7", 0, 3, 0], ["='シートA'!$A8", 0, 3, 0]]

このままでは保存しても数式がただの文字列として表示されているだけになってしまう為
数式をアクティブにする為に書き込み時にvalue_input_optionUSER_ENTEREDに指定する事で
数式の計算結果がセルに表示される様になります。

python

1for value in all_values: 2 worksheet.append_row(value, value_input_option='USER_ENTERED') 3 # APIへのリクエストは無償利用の場合100秒に100件までと制約がある為time.sleepでリクエスト回数を制限 4 time.sleep(1)

本題である数式をキープしたままの取得と保存の方法は以上となります。
しかしworksheet.range()などを使用した場合は数式の情報は失われてしまいます。
その為、セルの中身を操作する場合には何か他の方法で処理を行っていくか
数式がA列にしか含まれないというのであれば、A列とA列以外で処理を進めていく
または、数式情報をもったA列だけを予め変数に代入→その他のセルを処理(ここで数式情報を失う)→
再度A列だけを挿入しデータを成形してあげるなどの必要があると思います。

投稿2020/10/05 04:14

nto

総合スコア1438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問