我试图找出电子表格中哪个标签上次更改。
我有一个Google表格,其中有多个标签在多个用户之间共享。我可以检测到用户何时进行如下更改:
def testChanges(self):
response = self.service.revisions().list(fileId='some-file-id').execute()
revs = response.get('revisions',[])
if not len(revs):
return
revID = revs[-1].get('id')
response = self.service.revisions().get(
fileId='some-file-id',
revisionId=revID,
fields='kind, id, modifiedTime, lastModifyingUser'
).execute()
然后我得到答复:
{
"kind": "drive#revision",
"id": "12",
"modifiedTime": "2018-09-17T20:10:41.330Z",
"lastModifyingUser": {
"kind": "drive#user",
"displayName": "USER NAME",
"me": true,
"permissionId": "08921584708523400585",
"emailAddress": "email.address@gmail.com"
}
现在,我需要处理用户刚刚更改的选项卡。我该如何解决?我已经检查过Drive documentation和Sheets API,但到目前为止还没有运气。
答案 0 :(得分:1)
我不认为REST API支持或不可能做到这一点。您可能需要创建一个installed edit触发器,并使用它来记录edit event object(例如,将其发布到URL,将其附加到某些“前哨”电子表格中,等等)。您可以将其与当前的revisions
方法结合使用,以了解是谁进行了修改(因为用户身份通常是受限制的信息,除非您位于同一GSuite域中)。
将数据写入指定电子表格的示例。
function installedEdit(e) {
const edited = e.range,
sheet = edited.getSheet();
const row = [
new Date(), // Time of the edit
e.source.getId(), // id of the edited workbook.
e.source.getName(),
sheet.getName(), // edited sheet name
sheet.getSheetId(), // gridid for REST API
edited.getA1Notation(),
edited.oldValue !== undefined ? edited.oldValue : "",
edited.value !== undefined ? edited.value : ""
];
try { row.push(e.user.getEmail()); }
catch (e) { row.push("Unknown User"); }
// Log this row somehow
SpreadsheetApp.openById("some spreadsheet id").getSheetByName("Edit log").appendRow(row);
}
您可以在一个独立的Apps Script项目中创建此功能,并programmatically install将该功能作为您需要观看的各种电子表格的编辑触发器。
答案 1 :(得分:0)
您可以进行for循环以扫描所有选项卡(每隔几秒钟),并将所有选项卡的ModifyedTime存储在表中。对循环进行编程,以将每个选项卡的当前modifiedTime与您上次扫描的值进行比较。如果不匹配,则表示当前标签页已修改。
一个想法。