Mayaとエクセルとかスプレッドシートを連携させるで～

pythonでツール作っている人からするとあたりまえかもしれないですが、
せっかくの機会なので、何かしら残したくまとめておきます٩(๑•̀ω•́๑)۶

##動機

○csvでもいいんだけど、デザイナーも読みたいし、エクセル使いたいんだよな～
○エクセルのモーションリストからフレーム数とってきたいよな～
○出力してアップしたら勝手にGoogleSpreadsheetのステータス更新してほしいな～

などなど外部のデータを参照・更新したい・・・・・！！！！！！！

##外部モジュールとは

pythonにはサードパーティ製の外部モジュールがたくさん存在しています。
melにはできない、あんなことや、こんなことが簡単にできたりします。

```
import csv
import os
```

pythonでは最初にimportを挿入することで、いろんなモジュールを呼ぶことができます。
csvやosはもともとあるモジュールなので、別途落としてくる必要はありません。

MayaはPython2系なのでそれ用のモジュールを落としてくるように注意！

今回はmayaのスクリプトフォルダにモジュール群を直接置きますが、
チームでの管理の場合は別ディレクトリで管理したほうがよいので、
詳しくはこのあたりを！
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_04/
http://tm8r.hateblo.jp/entry/2016/10/18/222755

こんな感じで直接scriptsフォルダに置いています。

![image](https://qiita-image-store.s3.amazonaws.com/0/27631/75befabd-4e3c-ca3a-c9f2-b20d65445e21.png)

今回の環境
○ Windows 7
○ Maya 2016
○各モジュールの(○.○.○)は今回使用しているバージョンです！

pipを使ってインストールしてくるのがよいかと思います
pipの使い方
http://www.python-izm.com/contents/basis/pip.shtml
今回は簡易的に別のところにインストールしたものをscriptsに移動させました。

##excelを使う

xlrd (0.9.4)
xlwt (1.0.0)
xlutils (1.7.1)

エクセルの中にあるシーン名からフレーム数を取得し、かつ今日の日付を書き込む
.xlsでエクセルは保存するべし！

![image](https://qiita-image-store.s3.amazonaws.com/0/27631/df34f5cf-e5fc-ff1a-132f-63fe5b051592.png)


```
import xlrd
import xlwt
from xlutils.copy import copy
import maya.cmds as cmds
import os
import datetime

excel = "" # エクセルファイルのパス
scene = os.path.splitext(cmds.file(q=True, shortName=True, sceneName=True))[0]　# シーン名を取得

read = xlrd.open_workbook(excel)

ex_row = 0  #どの行が更新させるか保存しておく

d = datetime.datetime.today() # 今日の日付を取得
today = d.strftime("%Y/%m/%d")

sheet_1 = read.sheet_by_index(0)
for col in range(sheet_1.ncols):
    for row in range(sheet_1.nrows):
        if scene == sheet_1.cell(row, col).value:
            ex_row = row
            print u"スタートフレーム:" + sheet_1.cell(row, 1).value + u" エンドフレーム：" + sheet_1.cell(row, 2).value
            continue
            
# 必要があれば、出力の処理など　

write = copy(read)   # read用にとってきたオブジェクトを書き込み用のオブジェクトにスタイルも含め完コピ
sheet1 = write.get_sheet(0)    
sheet1.write(ex_row, 3, today)　# 4列めに今日の日付を追記する
write.save(excel)
```

##spreadsheetを使う

このあたりを参考にさせていただきました！
http://qiita.com/koyopro/items/d8d56f69f863f07e9378

基本的には上記のエクセルと同じことをします

gspread (0.4.1)
httplib2 (0.9.2)
oauth2client (4.0.0)
requests (2.12.1)
six (1.10.0)

```
import os
import datetime
import maya.cmds as cmds
import gspread
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow


flow = OAuth2WebServerFlow(client_id='クライアントID',
                           client_secret='クライアントシークレット',
                           scope='https://spreadsheets.google.com/feeds',
                           redirect_uri="urn:ietf:wg:oauth:2.0:oob")
                           
scene = os.path.splitext(cmds.file(q=True, shortName=True, sceneName=True))[0]

d = datetime.datetime.today() # 今日の日付を取得
today = d.strftime('%Y/%m/%d')

storage = Storage('cred.dat')　#　認証情報を保存しておくファイル
credentials = storage.get()
if credentials is None or credentials.invalid == True:
    authorize_url = flow.step1_get_authorize_url()
    cmds.confirmDialog(m='Go to the following link in your browser: ' + authorize_url)
    code = raw_input('Enter verification code: ').strip()
    credential = flow.step2_exchange(code)
    storage.put(credential)
    credential.set_store(storage)
    credentials = credential
    
gc = gspread.authorize(credentials)
spr = gc.open_by_key('スプレッドシートのID')

for j, worksheet in enumerate(spr.worksheets()):
    worksheet.get_all_values()
    list_of_lists = worksheet.get_all_values()
    for i, l in enumerate(list_of_lists):
        if l[0] == scene:
            print u'スタートフレーム:' + l[1] + u' エンドフレーム：' + l[2]
            continue
            
for j, worksheet in enumerate(spr.worksheets()):
    worksheet.get_all_values()
    list_of_lists = worksheet.get_all_values()
    for i, l in enumerate(list_of_lists):
        if l[0] == scene:
           worksheet.update_acell('D' + str(i+1), today)
```

１回目にアクセスすると
![spread1.png](https://qiita-image-store.s3.amazonaws.com/0/27631/44844e61-bfec-6121-6324-7967e6f50999.png)
こうゆうのが出てくるのが出てくるので、
アドレスをコピーしてブラウザに貼り付けます
![spread2.png](https://qiita-image-store.s3.amazonaws.com/0/27631/476c5402-e4ad-b34f-dfd0-c9b37305f411.png)
mayaでconfirmをおすと以下のようなウィンドウが出てくるので、ブラウザのコードをコピペする
![spread3.png](https://qiita-image-store.s3.amazonaws.com/0/27631/320a3530-2641-d781-0363-393238a7edc1.png)
２回目以降はcred.datの情報を見てアクセスしてくれるので、この作業は１回だけ

Mayaとは関係ないですが、spreadシートにあるデータが
社内のサーバーにあるか確認して、ステータスを更新するようなものも作りました。
Mayaからいろいろできれば、デザイナーさんがPythonを落とさなくてもいろんなツールを配布できるかもしれません！

あんまりMayaPython関係なくてごめんなさいね！

## 私の宣伝

猫の手も借りたいそこのあなた、仕事をください！！！！！！！ twitter: @yukarin33