入力としてcsvを受け取り、それを単一のスプレッドシートドキュメントに書き込む簡単なスクリプトを作成しようとしています。今は動作していますが、スクリプトは遅いです。2 つのワークシートに cca 350 行を書き込むのに約 10 分かかります。
これが私が持っているスクリプトです:
#!/usr/bin/python
import json, sys
import gspread
from oauth2client.client import SignedJwtAssertionCredentials
json_key = json.load(open('client_secrets.json'))
scope = ['https://spreadsheets.google.com/feeds']
# change to True to see Debug messages
DEBUG = False
def updateSheet(csv,sheet):
linelen = 0
counter1 = 1 # starting column in spreadsheet: A
counter2 = 1 # starting row in spreadsheet: 1
counter3 = 0 # helper for iterating through line entries
credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'], scope)
gc = gspread.authorize(credentials)
wks = gc.open("Test Spreadsheet")
worksheet = wks.get_worksheet(sheet)
if worksheet is None:
if sheet == 0:
worksheet = wks.add_worksheet("First Sheet",1,8)
elif sheet == 1:
worksheet = wks.add_worksheet("Second Sheet",1,8)
else:
print "Error: spreadsheet does not exist"
sys.exit(1)
worksheet.resize(1,8)
for i in csv:
line = i.split(",")
linelen = len(line)-1
if (counter3 > linelen):
counter3 = 0
if (counter1 > linelen):
counter1 = 1
if (DEBUG):
print "entry length (starting from 0): ", linelen
print "line: ", line
print "counter1: ", counter1
print "counter3: ", counter3
while (counter3<=linelen):
if (DEBUG):
print "writing line: ", line[counter3]
worksheet.update_cell(counter2, counter1, line[counter3].rstrip('\n'))
counter3 += 1
counter1 += 1
counter2 += 1
worksheet.resize(counter2,8)
私はシステム管理者なので、くだらないコードについて事前に謝罪します。
とにかく、スクリプトはcsvから1行ずつ取得し、カンマで分割し、セルごとに書き込むため、書き込むのに時間がかかります。これを cron に 1 日に 1 回実行させ、古いエントリを削除して新しいエントリを書き込むという考え方です。これが resize() を使用する理由です。
今、私は今のようにセルごとに書き込むのを避けて、csv行全体を取り、それを独自のセルに各値を入れてシートに書き込むより良い方法があるかどうか疑問に思っていますか? これにより、実行にかかる時間が大幅に短縮されます。
ありがとう!