2017-08-04 50 views
-1

目前,我试图找到一种方法来跟踪各个单元格更改随个别时间戳的更改。我想跟踪更改,以便每次更改这些行时,都会在另一列中标记新的时间戳。我需要跟踪每次有人使用新列中的新时间戳进行更改。如何使用Appscript函数和导入范围列跟踪时间戳

你认为有人可以帮助我吗?

这是我正在使用的功能,我只是要设置一个触发器,每天关闭。我不确定这是跟踪此类更改的最佳方法,因此如果有人有任何其他建议,我可以接受其他建议。唯一的想法是,当你使用importrange作为值时,onEdit函数不起作用。我把工作的一个例子中,我在这里使用:https://docs.google.com/spreadsheets/d/1PLmkEmJ6sMeu1Y-8mEJ5FaSNIXVnzEuYrilFNA7G0Pk/edit#gid=464181309

的.js我试图用:

function checkCompleted() { 
 
    var s = SpreadsheetApp.getActive().getSheetByName('Sheet1'); 
 
    s.getRange('G2:H').getValues() 
 
    .forEach (function (r, i) { 
 
    if(r[0] == 'Completed' && !r[1]) 
 
    s.getRange(i + 2, 8).setValue(new Date()) 
 
    }) 
 
}

+0

看看这个[链接](https://sites.google.com/site/appsscripttutorial/urlfetch-and-oauth/get-the-revision-history-对的一资源使用,已超出DocsList-API)。 – Cooper

+0

@pnuts你会有其他建议吗?我在这里不是一个有经验的开发人员。 –

+0

@cooper谢谢!这很有帮助 –

回答

0

更改跟踪日志

与跟踪的问题只需更改时间戳即可进行更改,因为您只知道给定行的最后更改。所以我建议只写一条短消息到一个日志条目,你可以随时回来阅读。这将包括时间戳,电子表格名称,工作表名称,范围更改,旧值和新值。您将需要创建一个文件。我使用Drive Notepad创建文件,并将所有这些类型的文件放在一个数据文件夹中,您将需要数据文件夹的ID。您还需要电子表格的ID和希望记录编辑的工作表的名称。

您需要为onEditLog函数创建onEdit触发器。

验证码:

function onEditLog(e) 
{ 
    var ss=e.source.openById('SpreadsheetId'); 
    var docnam=ss.getname(); 
    var shtnam=ss.getActiveSheet().getName(); 
    var range=e.range.getA1Notation(); 
    if(docnam=='Your Document Name' && shtnam=='Sheet1') 
    { 
    var msg= 'Spreadsheet: ' + docnam + ' Sheet: ' + shtnam + + 'Range: ' + range + ' has been changed from ' + e.oldvalue + ' to ' + e.value; 
    logEntry1(msg,'filename'); 
    } 

} 

function logEntry1(entry,file)//not you cannot run this function like other functions from your script editor. It must be run from an onEdit trigger so that it has access to the event object. 
{ 
    var file = (typeof(file) != 'undefined')?file:'eventlog.txt'; 
    var entry = (typeof(entry) != 'undefined')?entry:'No entry string provided.'; 
    if(entry) 
    { 
    var ts = Utilities.formatDate(new Date(), "GMT-6", "yyyy-MM-dd' 'hh:mm:ss a"); 
    var s = ts + ' - ' + entry + '\n'; 
    saveFile(s, file, true); 
    } 
} 

//this function is taken from myUtility library you'll need to add your own DefaultFileName and DataFolderID. 
function saveFile(datstr,filename,append) 
{ 
    var append = (typeof(append) !== 'undefined')? append : false; 
    var filename = (typeof(filename) !== 'undefined')? filename : DefaultFileName;//make change here. It is a string so put quotes around it. 
    var datstr = (typeof(datstr) !== 'undefined')? datstr : ''; 
    var folderID = (typeof(folderID) !== 'undefined')? folderID : DataFolderID;//make other change here. Again it is a string 
    var fldr = DriveApp.getFolderById(folderID); 
    var file = fldr.getFilesByName(filename); 
    var targetFound = false; 
    while(file.hasNext()) 
    { 
    var fi = file.next(); 
    var target = fi.getName(); 
    if(target == filename) 
    { 
     if(append) 
     { 
     datstr = fi.getBlob().getDataAsString() + datstr; 
     } 
     targetFound = true; 
     fi.setContent(datstr); 
    } 
    } 
    if(!targetFound) 
    { 
    var create = fldr.createFile(filename, datstr); 
    if(create) 
    { 
     targetFound = true; 
    } 
    } 
    return targetFound; 
} 
+0

感谢@Cooper,我遇到的问题是,这些更改来自导入区域,OnEdit无法使用AppScript跟踪导入区域。 –

+0

我可能不得不重新考虑这个过程,尽管如果没有简单的工作来使用OnEdit的ImportatRange。有什么想法吗? –

+0

既然你使用importRange,我想我可以假设你从另一个工作表或电子表格中获取数据。我不知道数据源是如何获取数据的,但是如果它与表单链接,你可以使用表单提交,或者你可以使用时间触发器并复制你想要的行并追加到目标表单中,我认为其中任何一个都可以被onChange触发器检测到。或者你可以从源电子表格脚本中进行计算。 – Cooper

相关问题