如何将单元格公式复制到上面的1行中,但要引用新行的数据(而不是以前的行数据)

时间:2019-07-05 06:08:06

标签: python google-sheets gspread

当我使用gspread将单元格公式从(target_cell)复制到(target_cell + 1行)时,该公式已正确传递,但仍引用(target_cell)行中的数据。我需要它来引用新行的数据。与您在Excel / Google表格中使用“拖动”或复制+ Shift +选择所有适当的单元格+粘贴方法类似。

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] How to copy a formula from one gsheet to another using 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 个答案:

答案 0 :(得分:1)

  • 您要使用gspread将公式复制到单元格中。
  • 例如,当单元格“ C3”中有一个=B3+A3公式时,您想将公式=B2+A2放在单元格“ C2”中。
  • 您已经将Sheets API与gspread一起使用了。

如果我的理解是正确的,那么该修改如何?我认为针对您的情况有几种解决方案。因此,请仅考虑其中之一。

修改点:

  • 在此修改中,Sheets API中的batchUpdate方法使用copyPaste请求。

修改后的脚本:

使用此功能时,请设置变量spreadsheetIdsheetName。在此示例脚本中,对于工作表名称“ 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)

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

编辑:

问题:

从您的其他脚本中,我可以了解此问题。问题是您使用电子表格的文件名(在您的情况下为stocks。)作为电子表格ID。如果要使用电子表格的文件名,请进行以下修改。

发件人:

spreadsheetId = "stocks"

收件人:

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