google-apps-script - 每次有人访问谷歌文档和/或使用应用程序脚本复制它时创建查看历史记录
问题描述
我写了一个脚本来记录谁以及何时打开了一个谷歌文档。它工作正常,但文档是供用户填写的模板,因此希望确保任何需要它的人都会通过应用程序脚本制作模板的副本。
我知道用户需要编辑权限才能使脚本正常工作,但就解决方法而言:
- 如果我给他们一个复制链接或模板链接,脚本是否仍然可以工作?使用 google sheet 作为基础并从 google doc ID 中提取是否更有意义?
如果这不起作用: 2) 有没有办法用菜单窗口提示他们复制文件但在打开时延迟 x 秒?
//setups a count for the file
function setup() {
var propertyService = PropertiesService.getDocumentProperties();
propertyService.setProperty('viewCount', '0');
}
//logs the email and date of the user accessing the file
function onOpen(e) {
var count = parseInt(PropertiesService.getDocumentProperties().getProperty('viewCount'))+1;
PropertiesService.getDocumentProperties().setProperty('viewCount', count);
Logger.log(count);
var sheet = SpreadsheetApp.openById([spreadsheet ID]);
var user = Session.getActiveUser().getEmail();
var date = new Date();
sheet.getSheetByName('View Count').appendRow([user,date]);
}
解决方案
您可以添加一个菜单项,为用户创建模板副本,将副本记录到您跟踪谁打开文件的同一工作表中,并提示用户打开他们的文件副本以开始工作。
脚步
首先:添加这3个功能。
- 第一个
copyFile
,创建活动文档的副本,并将其命名为相同的名称以及用户的电子邮件。然后它将活动记录到相同的更改日志中,将新文件的 ID 添加到行中。最后,由于这个漂亮的功能,它会弹出一个窗口,其中包含指向新文件的链接,因此用户可以轻松打开它并开始工作。 - 第二个
showAnchor
是生成 HTML 对话框的函数,该对话框向用户提供指向其新文件的链接。 - 第三,
createMenu
向 Google Docs 导航栏添加一个新菜单项,提示用户复制文档。当然,这会触发该copyFile
功能。
function copyFile() {
var thisDoc = DocumentApp.getActiveDocument()
var sheet = SpreadsheetApp.openById([spreadsheet ID]);
var user = Session.getActiveUser().getEmail();
var date = new Date();
var newCopy = DriveApp.getFileById(thisDoc.getId()).makeCopy(thisDoc.getName() + " " + user)
sheet.getSheetByName('View Count').appendRow([user,date,newCopy.getId()]);
var url = newCopy.getUrl()
showAnchor('Open Your File',url);
}
function showAnchor(name,url) {
var html = '<html><body><a href="'+url+'" target="blank" onclick="google.script.host.close()">'+name+'</a></body></html>';
var ui = HtmlService.createHtmlOutput(html)
DocumentApp.getUi().showModelessDialog(ui," ");
}
function createMenu() {
const ui = DocumentApp.getUi();
const menu = ui.createMenu("Copy This Template");
menu.addItem("Copy", "copyFile");
menu.addToUi();
}
然后:createMenu()
在 onOpen 脚本的末尾添加一个调用:
function onOpen(e) {
var count = parseInt(PropertiesService.getDocumentProperties().getProperty('viewCount'))+1;
PropertiesService.getDocumentProperties().setProperty('viewCount', count);
Logger.log(count);
var sheet = SpreadsheetApp.openById([spreadsheet ID]);
var user = Session.getActiveUser().getEmail();
var date = new Date();
sheet.getSheetByName('View Count').appendRow([user,date]);
createMenu();
}
推荐阅读
- python - 如何展平深度字典;用方括号包围任何子字典键
- pandas - pandas 使用 .loc() 从 df 中选择单个值会产生 df 而不是数字
- java - YouTube 视频活动
- javascript - JavaScript 数组 - 从平面到分层
- swift - 在 prepare segue 中使用 UIButton 的标签
- python - 无法从 dype ('
我正在尝试将日期时间数据从名为“标题”的文件插入到名为“位置”的文件的时间速率。当我使用发布的插值代码时,我得到 TypeError: Cannot cast array data from dtype('
我使用此代码将标题(hdg)日期和时间转换为日期时间
- python - 为大型数据框保存 csv 速度很慢
- reactjs - 带有语法错误的流 API 服务器
- c++ - OpenGL 着色器未从 glVertexAttribPointer() 获取值
- typescript - 无法将属性添加到 passport-linkedin-oauth2 声明文件的接口