【问题标题】:How to apply the same script for different sheets on the same spreadsheet?如何为同一个电子表格上的不同工作表应用相同的脚本?
【发布时间】:2018-06-17 22:28:12
【问题描述】:

我有一个谷歌表格文档,我需要在其中为每张表格单独运行相同的脚本,每当在 B 列上填充一个单元格时,该脚本就会在 A 列上放置一个时间戳

function onEdit(event)
{ 
  var timezone = "GMT-6";
  var timestamp_format = "MM-dd-yyyy HH:mm:ss"; // Timestamp 
  var updateColName = "ColumnB"; //Columna que es actualiza
  var timeStampColName = "ColumnA"; //Columna actualizada automáticamente
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); //Sheet 

  var actRng = SpreadsheetApp.getActiveSpreadsheet().getActiveRange();
  var editColumn = actRng.getColumn();
  var index = actRng.getRowIndex();
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
  var dateCol = headers[0].indexOf(timeStampColName);
  var updateCol = headers[0].indexOf(updateColName); updateCol = updateCol+1;
  if (dateCol > -1 && index > 1 && editColumn == updateCol) { // only timestamp if 'Last Updated' header exists, but not in the header row itself!
    var cell = sheet.getRange(index, dateCol + 1);
    var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
    cell.setValue(date);
  }
}

当我为 columnA、columnB 和 Sheet2 编写另一个脚本时,即使我从 Sheet2 在 columnB 上写了一些东西,也只将时间戳放在 sheet1 中。

有什么建议吗?

其中一个建议是这样的:

    function onEdit(event)
{ 
  var timezone = "GMT-6";
  var timestamp_format = "MM-dd-yyyy HH:mm:ss"; // Timestamp 
  var updateColName = "Timestamp"; //Columna que es actualiza
  var timeStampColName = "Ticket"; //Columna actualizada automáticamente
  var sheet = event.source.getActiveSheet();
  var actRng = event.source.getActiveRange();

  var editColumn = actRng.getColumn();
  var index = actRng.getRowIndex();
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
  var dateCol = headers[0].indexOf(timeStampColName);
  var updateCol = headers[0].indexOf(updateColName); updateCol = updateCol+1;
  if (dateCol > -1 && index > 1 && editColumn == updateCol) { // only timestamp if 'Last Updated' header exists, but not in the header row itself!
    var cell = sheet.getRange(index, dateCol + 1);
    var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
    cell.setValue(date);
  }
}

但它没有将时间戳放在A列上。

【问题讨论】:

  • 你在哪里调用这个函数?
  • 我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,请随时告诉我。我想学习解决你的问题。
  • 同一关键字不能用于多个函数定义 - 只保留一个。

标签: google-apps-script google-sheets


【解决方案1】:

当 B 列被编辑时,您希望将时间戳放入已编辑工作表的 A 列,该工作表在单元格“A1”和“B1”中具有 ColumnAColumnB。例如,当您在 Sheet1 中编辑 B 列时,它会将时间戳放到 Sheet1 的 A 列中。当你在Sheet2编辑B列时,它会将时间戳放到Sheet2的A列。如果我的理解是正确的,那么这个修改怎么样?我认为您的情况有几个答案。因此,请将此视为其中之一。

发件人:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1'); //Sheet 
var actRng = SpreadsheetApp.getActiveSpreadsheet().getActiveRange();

收件人:

var sheet = event.source.getActiveSheet();
var actRng = event.source.getActiveRange();

如果我的理解不是你想要的,请告诉我。我想修改我的答案。

【讨论】:

  • 是的,我的目标是在 B 列 (sheet1) 的单元格上写入并在 A 列 (sheet1) 上设置时间戳,如果我在 B 列 (sheet2) 的单元格上写入,则设置时间戳A 列(工作表 2)。
  • @hkviktor 感谢您的回复。我认为我的修改是这样工作的。请问您这种修改是否适用于您的环境?从您的脚本中,为了像这样工作,ColumnAColumnB 的值需要放在您要使用的工作表的单元格“A1”和“B1”中。
  • 我尝试了你的建议,但它似乎不起作用,也澄清了单元格上的部分......假设我在单元格 B45 上写,那么时间戳必须放在单元格 A45 上同一张纸。
  • @hkviktor onEdit()Simple Triggers。我真的很抱歉。我原以为您使用onEdit() 作为简单触发器。编辑工作表时,将运行 onEdit()。我想你可以直接在脚本编辑器上运行onEdit()。如果直接运行onEdit(),就会出现这样的错误。使用时请直接编辑电子表格的B列。如果您想将onEdit() 用作简单触发器和普通函数,请告诉我。
  • @hkviktor 对不起。我对你的情况感到困惑。您不想使用简单触发器。但是您使用的是简单触发器的onEdit(event)。我能问一下你使用onEdit(event)的原因吗?我认为如果您不想使用简单触发器,则需要更改函数名称。
【解决方案2】:

我通过创建一个新项目来为新页面复制相同的代码来解决这个问题。非常感谢您的帮助。

【讨论】:

  • 这听起来像是一场维护噩梦 - 同一个文档的两个绑定脚本项目,它们之间的代码略有不同?
  • 也许可以,但有机会将代码应用于不同的工作表。
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 2020-11-23
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多