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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1656閲覧

pandas, gspreadについて

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/11/12 06:33

編集2020/11/12 06:34

実現したいこと

スプレッドシートのデータをexcelに貼りつけたい

初め、スプレッドシートをdataframeに格納してからエクセルに貼り付けのコードを書いてたのですがget_as_dataframeは取得してくる範囲設定が必須と書いてあり
私の場合データが増えていくので範囲指定ができず、シートごと取得する方法を探してのですがgspreadのcopyは新しいシートにコピーまたduplicate_sheet()もスプレッド自体にしかできなさそうで解決策ご存じの方ご教授お願いします。

スプレッドシートをdataframeに格納してからエクセルに貼り付けのコード

python

1import os 2import gspread 3from gspread_dataframe import get_as_dataframe, set_with_dataframe 4from oauth2client.service_account import ServiceAccountCredentials 5import pandas as pd 6import json 7import win32com.client 8import openpyxl as px 9import xlsxwriter 10from openpyxl.utils.dataframe import dataframe_to_rows 11from openpyxl.utils import get_column_letter 12import clipboard as clp 13import datetime 14now = datetime.datetime.now() 15path1 = "xxxxx.xlsm" 16scope = ['https://spreadsheets.google.com/feeds', 17 'https://www.googleapis.com/auth/drive'] 18 19 20credentials = ServiceAccountCredentials.from_json_keyfile_name('XXXXXXXXXXXX', scope) 21gc = gspread.authorize(credentials) 22#エクセルファイル読み込み 23wb = px.load_workbook(filename=path1, keep_vba=True) 24ws = wb['シート名'] 25 26wks = gc.open('xxxx').worksheet('xxxx1') 27#スプレッドシートデータをdataframeに取り込む 28spread = get_as_dataframe(wks,sheet_name='xxxx1',usecols=[3,4,5,6,7,8,9],skiprows=2, skipcol=3,evaluate_formulas=True) 29 30print(spread) 31 32rows = dataframe_to_rows(spread, index=False, header=False) 33 34#セルに値貼り付け 35for r_idx, row in enumerate(rows, start=5): 36 for c_idx, value in enumerate(row, start=2): 37 ws.cell(row=r_idx, column=c_idx, value=value) 38

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

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

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

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

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

nto

2020/11/12 09:36

厳密には原則としてget_as_dataframeに限らず、範囲を指定しないと限り任意のセルへの書き込みは出来ません。 例えば「データが入力された最終行の次の行」←こちらも範囲の指定となります。 一体どういった容量のどういったデータを、スプレッドシート内のどこに貼り付けしたいのかを明示的にする必要があると思います。
退会済みユーザー

退会済みユーザー

2020/11/13 02:22

お返事ありがとうございます。 なるほど! copy、duplicate_sheet()はスプレッドシートからスプレッドシートしか無理という認識で間違いなでしょうか??
nto

2020/11/13 03:53

はい。いずれのメソッドもシートキーやシートIdなどを使用するものであり、スプレッドシートtoスプレッドシートが対象となります。 例えば日毎に数件、スプレッドシートへとデータが追加され、追加されたデータだけをExcelに追加していきたいという事であれば、スプレッドシート上で同時にいつ追加したかも管理する事で新規追加された日にちを指定してExcelに追加する事もできるでしょうし スプレッドシートへのデータ追加自体が手動ではなくpythonなどで行われているのならば、その際に同時にExcelにもデータを追加すれば良いでしょう。
退会済みユーザー

退会済みユーザー

2020/11/13 04:12

とても丁寧な説明ありがとうございます。 スプレッドシートへのデータ追加自体が手動ではなくpythonなどで行われているのならば、その際に同時にExcelにもデータを追加すれば良いでしょう。 ↓ 追加というのはget_as_dataframeのようにdataframeに格納しないと難しいですか??
nto

2020/11/13 04:57

そうなると、単なるExcelへのデータの追加となるのでまずはpythonによるExcelへのデータの追加の手法等をお調べしてはいかがでしょうか。 データフレームに限らず、Excelへの書き込みの手法は様々あると思います。 どういった形式でExcelに保存されているのかわからない為具体的な解答が出来ませんが、例えばExcel内の最終行を取得し、最終行+1を指定して書き込んでいく等。
退会済みユーザー

退会済みユーザー

2020/11/13 06:02

excelのsheet1(すべて空白)にスプレッドシートの202011というシートに書いてある全ての値を取得し貼り付けたいでのです!
nto

2020/11/13 07:27

質問する際にかなり大事な情報だと思います。 一番初めにコメント差し上げた際にも明示的にする様にとコメント差し上げましたが事前の質問内容の投稿時にそういった内容は記載すべきです。
guest

回答1

0

ベストアンサー

既に.get_as_dataframe()にてスプレッドシート内のデータをデータフレーム化する事が出来ているので
あとはpandasによる.to_excel()にてデータフレームをExcelファイルに変換する事が可能です。

python

1from gspread_dataframe import get_as_dataframe 2import pandas 3 4df_sps = get_as_dataframe('任意のシート',usecols=['任意'],skiprows='任意', skipcol='任意',evaluate_formulas='任意') 5df_sps.to_excel('ファイルパス', index=False, header=False) 6

binファイルの抽出とExcelファイルへの適用について

.to_excel()では直接xlsmを生成/上書きする事は出来ません。
既存のマクロ有効ブックを上書きするといった場合には

  • 予めバイナリファイルを抽出してく
  • 一旦xlsxで保存
  • その後バイナリファイルを適用
  • xlsmにリネーム

という手順を踏む必要があります。バイナリファイルの抽出は以下のコマンドで
vbaProject.binというマクロが格納されたバイナリファイルが抽出可能です。

python C:\Users\ユーザー名\AppData\Local\Programs\Python\Pythonバージョン(適宜)\Scripts\vba_extract.py 抽出したいExcelの絶対パス

binファイルの抽出が出来たら以下の様にして.to_excel()を用いてマクロ有効ブックの保存が可能です。

python

1# 一時的に.xlsxで保存 2writer = pd.ExcelWriter('xxxxx.xlsx', engine='xlsxwriter') 3 4df_sps.to_excel(writer, sheet_name='Sheet1') 5 6workbook = writer.book 7# マクロ有効ブック形式にリネーム 8workbook.filename = 'xxxxx.xlsm' 9# binファイルを適用 10workbook.add_vba_project('./vbaProject.bin') 11 12writer.save()

投稿2020/11/13 07:31

編集2020/11/16 07:49
nto

総合スコア1438

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

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

退会済みユーザー

退会済みユーザー

2020/11/16 06:44 編集

試してみますとターミナルにエラー出ないのですがエクセルに反映されません、、、、、何がダメなのでしょうか、、、
退会済みユーザー

退会済みユーザー

2020/11/16 06:03 編集

import gspread from oauth2client.service_account import ServiceAccountCredentials from gspread_dataframe import get_as_dataframe import win32com.client import openpyxl as px import pandas as pd import glob from openpyxl.utils.dataframe import dataframe_to_rows import pandas scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] #認証情報設定 credentials = ServiceAccountCredentials.from_json_keyfile_name('xxxxx.json', scope) #OAuth2の資格情報を使用してgoogle APIにログインします gc = gspread.authorize(credentials) # print(wks.worksheets()) #ワークブックを読み込む wb=px.load_workbook(’xxxx.xlsm',keep_vba=True,read_only=False) #シートにアクセスする ws=wb["シフト|スプレッド取得"] wks = gc.open('gspreadサンプル').worksheet('シート1') df_sps = get_as_dataframe(wks,sheet_name='シート1',usecols=[3,4,5,6,7],skiprows=2, skipcol=3,evaluate_formulas=True) df_sps.to_excel(’xxxxx.xlsm', index=False, header=False) print(df_sps)
nto

2020/11/16 07:35

'gspreadサンプル'というのはシートキーでも入れているのでしょうか? その場合にはgc.open()ではなくgc.open_by_key(シートキー)です。 また.to_excel()はマクロ有効ブックは対応しておりません。 - Excelファイルを新規で作成しようとしているという場合→素直にxlsxで保存する - マクロは組まれておらず、単に拡張子がxlsmの場合→xlsxで保存する - 既存のマクロを持ったExcelファイルに上書きをしようとしている場合→予めbinファイルを抽出し、xlsxで保存、後にリネームとbinファイルを適用 - これからマクロを設定する場合→まずはxlsxで保存の後にマクロファイルに変換しましょう。 bin抽出参考:https://stackoverflow.com/questions/40913896/python-vba-extract-to-get-bin-of-macro
退会済みユーザー

退会済みユーザー

2020/11/17 05:46

とても丁寧な説明ありがとうございます。 'gspreadサンプル'はシートキーとは別です! 既存のマクロが入っているので.xlsmを使用しています 質問なのですがbinファイルを抽出し、xlsxで保存、の後にマクロファイルに変換するのことは可能なのでしょうか?? あとfrom openpyxl.utils.dataframe import dataframe_to_rowsのやり方もしてみたのですがこちらも上手くいかず おそらくの原因がとってくる値の中に空白の部分がNanと取得されてしまっているのがダメだと考えているのですが関係ありませんか?? 図々しく質問すみません。 お手すきの際にご回答いただけると幸いです。
nto

2020/11/17 07:26 編集

>>> 質問なのですがbinファイルを抽出し、xlsxで保存、の後にマクロファイルに変換するのことは可能なのでしょうか?? A.既に先日の回答に追記で掲載しております。 >>> Nanと取得されてしまっているのがダメだと考えているのですが関係ありませんか?? A.Nan値について一度ご自身で調べたり等はされましたか? Nanというのは欠損値の事を言います。特にそれが影響しているといったことはないかと思われます。 先日の回答はご確認頂けていらっしゃいますでしょうか。 dataframe_to_rows()は使用しておりません。使用する必要がありません。 dfにした時点で、そのdfをそのままto_excel()でExcel形式に変換するだけで問題ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問