Как скопировать формулу ячейки в 1 строку выше, но ссылаться на данные новой строки (а не данные предыдущих строк) - PullRequest
1 голос
/ 05 июля 2019

Когда я использую gspread для копирования формулы ячейки из (target_cell) в (target_cell + 1 строка), формула правильно передается, однако она все еще ссылается на данные из строки (target_cell). Мне нужно, чтобы ссылаться на данные новой строки. Аналогично тому, когда вы используете «перетаскивание» или копирование + Shift + выберите все подходящие ячейки + метод вставки в Excel / Google листов.

look at image below: here is what I am trying to do, start at C3 and go up to C1, copying and pasting C3 formula but referencing data in rows 2 and 1

В настоящее время я могу использовать gspread для получения формулы из определенной ячейки, используя это: ([source] Как скопировать формулу из одного gsheet в другой, используя python? )

formula = sheet.acell("C3", value_render_option='FORMULA').value
    print(formula)

Я хочу скопировать эту формулу (= B3 + A3) в строке выше, но ссылка A2 и B2 не указана. Пока я вижу только один способ обновить ячейку, но я могу манипулировать формулой между ними?

sheet.update_acell("C2", formula)

trying to upload image again

Вот весь код, использующий первый полученный мной ответ:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(creds)

#this portion is to ensure I can reach the target spreadsheet and manipulate the spreadsheet. It does work.
sheet = client.open("stocks").worksheet("sandbox")
input=sheet.find(r"start")
tgtrow=input.row
tgtcol=(input.col)
sheet.insert_row(["",""],tgtrow+1)
sheet.update_cell(tgtrow,tgtcol+4, "hi")

#running recomended code
spreadsheetId = "stocks"
sheetName = "sandbox"

client = gspread.authorize(creds)
ss = client.open_by_key(spreadsheetId)
sheetId = ss.worksheet(sheetName)._properties['sheetId']
body = {
    "requests": [
        {
            "copyPaste": {
                "source": {
                    "sheetId": sheetId,
                    "startRowIndex": 2,
                    "endRowIndex": 3,
                    "startColumnIndex": 2,
                    "endColumnIndex": 3
                },
                "destination": {
                    "sheetId": sheetId,
                    "startRowIndex": 1,
                    "endRowIndex": 2,
                    "startColumnIndex": 2,
                    "endColumnIndex": 3
                },
                "pasteType": "PASTE_FORMULA"
            }
        }
    ]
}
res = ss.batch_update(body)

1 Ответ

1 голос
/ 05 июля 2019
  • Вы хотите скопировать формулу в ячейку, используя gspread.
  • Например, когда в ячейке «C3» есть формула =B3+A3, вы хотите поместить формулу =B2+A2 в ячейку «C2».
  • Вы уже использовали Sheets API с gspread.

Если мое понимание верно, как насчет этой модификации? Я думаю, что есть несколько решений для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них.

Точка модификации:

  • В этой модификации запрос copyPaste используется методом batchUpdate в Sheets API.

Модифицированный скрипт:

Когда вы используете это, пожалуйста, установите переменные spreadsheetId и sheetName. В этом примере сценария для имени листа «Sheet1» формула ячейки «C3» копируется в ячейку «C2». В это время =B3+A3 автоматически изменяется на =B2+A2.

spreadsheetId = "###"
sheetName = "Sheet1"

client = gspread.authorize(credentials)
ss = client.open_by_key(spreadsheetId)
sheetId = ss.worksheet(sheetName)._properties['sheetId']
body = {
    "requests": [
        {
            "copyPaste": {
                "source": {
                    "sheetId": sheetId,
                    "startRowIndex": 2,
                    "endRowIndex": 3,
                    "startColumnIndex": 2,
                    "endColumnIndex": 3
                },
                "destination": {
                    "sheetId": sheetId,
                    "startRowIndex": 1,
                    "endRowIndex": 2,
                    "startColumnIndex": 2,
                    "endColumnIndex": 3
                },
                "pasteType": "PASTE_FORMULA"
            }
        }
    ]
}
res = ss.batch_update(body)

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

Edit:

Проблема:

По вашему дополнительному сценарию я смог понять проблему. Проблема заключалась в том, что вы используете имя таблицы (в вашем случае это stocks.) В качестве идентификатора таблицы. Если вы хотите использовать имя файла электронной таблицы, измените его следующим образом.

От:

spreadsheetId = "stocks"

Кому:

spreadsheetId = client.open("stocks").id
...