我是谷歌脚本的新手。我找到了应该有效的东西,但没有。我搜索过,但无法找到解决方案。
我找到的脚本:
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("My Sheet name");
var statusValues = sheet.getRange("D:D").getValues();
var dateValues = sheet.getRange("E:E").getValues();
for (var row in statusValues) {
if (statusValues[row] != "Yes" && dateValues[row] == "") {
var num = parseInt(row) + 1;
sheet.getRange(num, 17).setValue(new Date());
}
}
};
当D中的单元格显示Yes
(在同一行)时,应该自动在E列中应用编辑日期。当我调试它时,我得到:
TypeError: Cannot call method "getRange" of null. (line 5, file "Code")*
我的D列是一个下拉菜单,其中包含空白/是/否选项。这可能是为什么?此外,它不会显示在我的云端硬盘中。我读到了应该发生的地方。
答案 0 :(得分:2)
不确定您是否解决了所有问题,但我想我会分享我的解决方案。
我们的团队有多个电子表格,用于记录最后一个用户编辑行,以及该行最后两列的编辑日期。
首先我有一个masterOnEdit(e)函数,如下所示:
function masterOnEdit(e) {
// Get active spreadsheet and row information
var sheet = SpreadsheetApp.getActiveSheet();
var row = e.source.getActiveCell().getRow();
var col = e.source.getActiveCell().getColumn();
// Set last updated and user cells if not editing those cells
if (row > 3 && col < (sheet.getLastColumn()-2)) {
setLastUpdated(sheet);
}
}
此函数忽略前三行(我的标题行)并忽略对最后两列的编辑(如果您想手动添加用户/日期)。
此函数还调用一个名为setLastUpdated(sheet)的函数。请注意,我将工作表变量传递给此子功能以限制Google API调用。真正的编辑在这里进行:
function setLastUpdated(sheet){
var row = sheet.getActiveCell().getRow();
var email = Session.getActiveUser().getEmail();
var user = parseUser(email);
var userCell = sheet.getRange(row, sheet.getLastColumn()-1)
userCell.setValue(user.name);
userCell.setBackground(user.color);
var date = Utilities.formatDate(new Date(), "GMT-5", "h:mm a M/d/yy");
sheet.getRange(row, sheet.getLastColumn()).setValue(date);
}
此代码块中的另一个子函数解析用户名。此功能接收谷歌返回的电子邮件,并使用正则表达式将其解析为我们的团队名称。这也允许我根据哪个团队成员进行编辑来设置用户单元格的颜色。
function parseUser(email) {
var user = {name: email, color:'#FFFFFF'}
if (/peter/.test(email)){
user.name = 'Peter';
user.color = '#4585F1';
}
}
希望这会有所帮助。我基于我在网上找到的一些最完整的例子构建了这个。真正帮助我们的团队跟踪正在处理电子表格工作流程的人员。
答案 1 :(得分:1)
试试这段代码:
请勿忘记更改工作表名称的“我的工作表名称”
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("My Sheet name"); // don't forget to change by your sheet name
var statusValues = sheet.getRange("D:E").getValues(); // performed a one time import - more efficient
for (var row in statusValues) {
if (statusValues[row][0] == "Yes" && statusValues[row][1] == "") {
var num = parseInt(row) + 1;
sheet.getRange(num, 5).setValue(new Date()); // "5" is the column where the date is wrote
}
}
};
答案 2 :(得分:0)
最后,在经历了很多围绕@Harold的帮助之后,我得到了这个工作。 仅供参考我有一张桌子,其中E记录D drop菜单设置为YES的日期,如果我将D更改为其他任何内容,则E中的此日期将被删除。 F和G的运行相同。
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("MySheet"); // don't forget to change by your sheet name
var statusValues = sheet.getRange("D:E").getValues(); // performed a one time import - more efficient
var statusValues2 = sheet.getRange("F:G").getValues();
for (var row in statusValues) {
if (statusValues[row][0] == "Yes" && statusValues[row][1] == "") {
var num = parseInt(row) + 1;
sheet.getRange(num, 5).setValue(new Date()); // "5" is the column where the date is wrote
}
if (statusValues[row][0] != "Yes" && statusValues[row][1] != "Date") {
var num = parseInt(row) + 1;
sheet.getRange(num, 5).setValue(""); // "5" is the column where the date is wrote
}
}
for (var row in statusValues2) {
if (statusValues2[row][0] == "Yes" && statusValues2[row][1] == "") {
var num = parseInt(row) + 1;
sheet.getRange(num, 7).setValue(new Date());
}
if (statusValues2[row][0] != "Yes" && statusValues2[row][1] != "Date") {
var num = parseInt(row) + 1;
sheet.getRange(num, 7).setValue("");
}
}
};
任何有关精简这一点的建议仍然受到欢迎。