当我使用gspread将单元格公式从(target_cell)复制到(target_cell + 1行)时,该公式已正确传递,但仍引用(target_cell)行中的数据。我需要它来引用新行的数据。与您在Excel / Google表格中使用“拖动”或复制+ Shift +选择所有适当的单元格+粘贴方法类似。
我目前可以使用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)
这是使用我得到的第一个响应的完整代码:
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)
答案 0 :(得分:1)
=B3+A3
公式时,您想将公式=B2+A2
放在单元格“ C2”中。如果我的理解是正确的,那么该修改如何?我认为针对您的情况有几种解决方案。因此,请仅考虑其中之一。
使用此功能时,请设置变量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)
如果我误解了您的问题,而这不是您想要的结果,我深表歉意。
从您的其他脚本中,我可以了解此问题。问题是您使用电子表格的文件名(在您的情况下为stocks
。)作为电子表格ID。如果要使用电子表格的文件名,请进行以下修改。
spreadsheetId = "stocks"
spreadsheetId = client.open("stocks").id