首页 > 解决方案 > 每次有人访问谷歌文档和/或使用应用程序脚本复制它时创建查看历史记录

问题描述

我写了一个脚本来记录谁以及何时打开了一个谷歌文档。它工作正常,但文档是供用户填写的模板,因此希望确保任何需要它的人都会通过应用程序脚本制作模板的副本。

我知道用户需要编辑权限才能使脚本正常工作,但就解决方法而言:

  1. 如果我给他们一个复制链接或模板链接,脚本是否仍然可以工作?使用 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]);
}

标签: google-apps-scriptgoogle-sheetsgoogle-docs

解决方案


您可以添加一个菜单项,为用户创建模板副本,将副本记录到您跟踪谁打开文件的同一工作表中,并提示用户打开他们的文件副本以开始工作。

脚步

首先:添加这3个功能。

  1. 第一个copyFile,创建活动文档的副本,并将其命名为相同的名称以及用户的电子邮件。然后它将活动记录到相同的更改日志中,将新文件的 ID 添加到行中。最后,由于这个漂亮的功能,它会弹出一个窗口,其中包含指向新文件的链接,因此用户可以轻松打开它并开始工作。
  2. 第二个showAnchor是生成 HTML 对话框的函数,该对话框向用户提供指向其新文件的链接。
  3. 第三,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();
}

推荐阅读