web-dev-qa-db-ja.com

PythonのAPIを使用してGoogleスプレッドシートの(ワーク)シートの名前を変更するにはどうすればよいですか?

私は長い間、この問題を解決しようと試みています。 gspreadのドキュメントを読みましたが、ワークシートの名前を変更する方法が見つかりません。方法を知っている人はいますか?よろしくお願いします!確かにワークシートの名前を与えるworksheet.titleがありますが、実際のシートの名前を変更する方法が見つかりません。

前もって感謝します!

24
Ilden Gemil

これは私が個人的にコーディングしたライブラリの抜粋です:

def _batch(self, requests):
    body = {
        'requests': requests
    }
    return self._service.spreadsheets().batchUpdate(spreadsheetId=self.spreadsheetId, body=body).execute()

def renameSheet(self, sheetId, newName):
    return self._batch({
        "updateSheetProperties": {
            "properties": {
                "sheetId": sheetId,
                "title": newName,
            },
            "fields": "title",
        }
    })

少しの努力で、それをコードに実装して、必要なものを取得できると思います。 batchUpdate呼び出しを行うには、 Python QUickstart-Google Sheet API で説明されているように、spreadsheetIdと初期化されたserviceが必要です。

25
Mattia Galati

あなたの答えは、PythonからのHTTPリクエストを介して解決できます。

リンクは ここ

HTTP経由でワークシートのある種のメタデータを送信する必要があります。

たとえば、Pythonを使用してワークシートのIDを取得し、次の情報を送信します。

<entry>
  <id>
    https://spreadsheets.google.com/feeds/worksheets/key/private/full/worksheetId
  </id>
  <updated>2007-07-30T18:51:30.666Z</updated>
  <category scheme="http://schemas.google.com/spreadsheets/2006"
    term="http://schemas.google.com/spreadsheets/2006#worksheet"/>
  <title type="text">Income</title>
  <content type="text">Expenses</content>
  <link rel="http://schemas.google.com/spreadsheets/2006#listfeed"
    type="application/atom+xml" href="https://spreadsheets.google.com/feeds/list/key/worksheetId/private/full"/>
  <link rel="http://schemas.google.com/spreadsheets/2006#cellsfeed"
    type="application/atom+xml" href="https://spreadsheets.google.com/feeds/cells/key/worksheetId/private/full"/>
  <link rel="self" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/worksheets/key/private/full/worksheetId"/>
  <link rel="edit" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/worksheets/key/private/full/worksheetId/version"/>
  <gs:rowCount>45</gs:rowCount>
  <gs:colCount>15</gs:colCount>
</entry>

WebサイトにはJavaおよび.NETソリューションも含まれています(これはレガシーバージョン3用です)。

新しいバージョンでは、POST httpリクエストPythonからのhttpリクエストも使用して、バッチ更新を使用できます。

リンクは ここ

リクエストのデータは

{
  "requests": [{
      "updateSpreadsheetProperties": {
          "properties": {"title": "My New Title"},
          "fields": "title"
        }
    }]
}

POST to https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate 経由で送信されます

どちらのリクエストでも、URLのスプレッドシートIDを、編集しているGoogleスプレッドシートのIDに置き換えます。

URLのv3からv4への変更に注意してください。

バージョン3のアプリケーションを使用していて、移行したい場合、そのリンクは here です。

編集

コメント投稿者は、2番目のリクエストはワークシートの名前を変更しないことに注意しました。追加したリンクは、ワークシートの複雑なプロパティを変更する方法を示しています。まもなく回答を更新します。

3
ytpillai

あなたはAPI v4のgspreadポートで同じことを達成できます: pygsheets (ここに著者)。

Pygsheetsを使用する対応するコードは次のようになります。

import pygsheets

gc = pygsheets.authorize()

# open spreadsheet and then worksheet
sh = gc.open('my new spreadsheet')
wks = sh.sheet1
wks.title = 'new title'
2
Nithin

Nodeを使用している場合、ここで私のために働いたものです:

import {google} from 'googleapis';

const auth = new google.auth.OAuth2(...)

const sheetsService = google.sheets({version: 'v4', auth})

const requests = [
 {
  updateSheetProperties: {
   properties: {
    sheetId: 'id-of-the-sheet-that-you-want-to-rename',
    title: 'new-title',
   },
   fields: 'title'
   }
  }
];

sheetsService.spreadsheets.batchUpdate({
 spreadsheetId: 'some-spreasheet-id',
 requestBody: {
  requests,
 },
});
1
Alexey Yunoshev

これは、Google APIメソッドでのみ実装することもできます。

これはjsonフリーのソリューションです。

sheetsService = getSheetsService();
// create a SheetProperty object and put there all your parameters (new title, sheet id, something else)
SheetProperties title = new SheetProperties().setSheetId(0).setTitle("Main");
// make a request with this properties
UpdateSheetPropertiesRequest rename = new UpdateSheetPropertiesRequest().setProperties(title);
// set fields you want to update
rename.setFields("title");
// as requestBody.setRequests gets a list, you need to compose an list from your request
List<Request> requests = new ArrayList<>();
// convert to Request
Request request = new Request().setUpdateSheetProperties(rename);
requests.add(request);
BatchUpdateSpreadsheetRequest requestBody = new BatchUpdateSpreadsheetRequest();
requestBody.setRequests(requests);
// now you can execute batchUpdate with your sheetsService and SHEET_ID
sheetsService.spreadsheets().batchUpdate(SHEET_ID, requestBody).execute();

ここ あなたはsheetPropertiesでより多くの情報を見つけることができます

0