【问题标题】:Run a script in Google Sheets that generates formulas into cells when a specific cell is not empty在特定单元格不为空时在 Google 表格中运行一个脚本,将公式生成到单元格中
【发布时间】:2020-04-10 13:42:27
【问题描述】:

我正在寻找一个在编辑 Col15 时在 Col16 和 Col17 中生成 2 个公式的脚本。 我的 Google 函数公式是:

  • 在 Col16 中:=if(O12"";today();"")
  • 在 Col17 中:=if(O12=""; ""; 连接(text(P12;"YYYY-MM-DD");" - ";E12;" - "; O12))

我需要为 5 张名为“Miriam”、“Elisa”、“Victor”、“Hanane”、“Sarah”的工作表运行此脚本。

function onEdit(event) {
  // assumes source data in sheet named Elisa-Miriam-Victor-Hanane-Sarah-Apoorva
  // target sheet of move to named Archive
  // getColumn with check-boxes is currently set to column 2 or B
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  // When a client is mentioned in Col3, fill automatically Col23 or W by the PM name and generate the checkbox from data validation in Col2 or B   
  var lastRow = s.getLastRow();
  var col23 = s.getRange(lastRow, 23).getValue();
    if (r.getRow() == lastRow && r.getColumn() == 3 && col23 == ""){
    s.getRange(lastRow, 23).setValue(s.getSheetName());
    var rule = SpreadsheetApp.newDataValidation().requireCheckbox().build()
    s.getRange(lastRow,2).setDataValidation(rule);
  }

  // Fill automatically Columns P and Q when PO number is provided in Column O.
  //In P: generates the date of when the PO is mentioned; in Q: it generates the PO folder name
  var sh=event.range.getSheet();
  var namesA=["Miriam","Elisa","Hanane","Sarah","Apoorva","Victor"];
  if(namesA.indexOf(sh.getName())!=-1 && e.range.columnStart==15) {
     event.range.offset(0,1).setValue(new Date()).setNumberFormat("yyyy-MM-dd");
     event.range.offset(0,2).setFormula(Utilities.formatString('=CONCATENATE(P%s,"-",E%s,P%s)',event.range.rowStart,event.range.rowStart,event.range.rowStart));
   }     

  // Archive a project with checked box from Archive Sheet
 if((s.getName() == "Miriam"||s.getName() == "Elisa"||s.getName() == "Hanane"||s.getName() == "Sarah"||s.getName() == "Apoorva"||s.getName() == "Victor")&& r.getColumn() == 2 && r.getValue() == true) { // copy past every time a new PM-sheet is added
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Archive");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  } 


  // Unarchive a project from Archive sheet to respective owner
  else if(s.getName() == "Archive" && r.getColumn() == 2 && r.getValue() == false) {
    var row = r.getRow();
    var nameColumn = 23;
    var name = s.getRange(row, nameColumn).getValue();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName(name);
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);   
}
}

我设法在 Col16 中生成了 Col15 的编辑日期。但是我不明白为什么该脚本不适用于具有连接公式的 Col17

【问题讨论】:

  • 什么是不工作是什么意思?
  • Col17 中没有发生任何事情;我没有看到连接公式
  • 你在做什么来调试你的代码?
  • 您的偏移量正在使用 CONCAT[0] 而 CONCAT[2] 没有 CONCAT[2]
  • 抱歉,我是脚本新手……我不明白你的意思

标签: javascript google-apps-script google-sheets


【解决方案1】:

试试这个:

function onEdit(e) {
  var sh=e.range.getSheet();
  var namesA=["Miriam","Elisa","Hanane","Sarah","Apoorva","Victor"];
  if(namesA.indexOf(sh.getName())!=-1 && e.range.columnStart==15) {
     e.range.offset(0,1).setValue(new Date()).setNumberFormat("yyyy-MM-dd");
     e.range.offset(0,2).setFormula(Utilities.formatString('=CONCATENATE(P%s,"-",E%s,P%s)',e.range.rowStart,e.range.rowStart,e.range.rowStart));
   }     
}

【讨论】:

  • 再次感谢您的帮助!我需要定义实用程序吗?我仍然无法在单元格中生成连接:哭泣:
  • 实用程序是核心服务的一部分。
  • 在您的问题中分享您当前代码的副本。
  • 好吧,你的 onEdit() 中肯定有很多事情要做。我尽量保持简单,因为必须在 30 秒内完成。我的示例中的任何方式 onEdit 似乎都可以正常工作,因此可能与其他部分有关。祝你好运。
  • 我认为这与实用程序有关。我只是将您的脚本复制粘贴到一个新的脚本文件中(因此没有其他信息)并且“实用程序”的颜色没有改变。所以脚本适用于日期生成,但我仍然无法连接。再次感谢您的帮助,祝您周末愉快
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多