用于编辑单元格的脚本,从今天开始每周设置到期日期

时间:2019-10-30 21:08:46

标签: google-apps-script google-sheets

正如标题所述,当两个相邻单元格之一被编辑时,我要在今天之后的一周内向单元格添加截止日期。第一个单元是贡献者,因此当有人被分配到任务时,将设置截止日期。第二个单元格是完成状态,因此当任务设置为“已完成”时,它将把截止日期单元格更改为“完成”。

我不希望在当前日期更改时更改此设置。另外,如果稍后对conributor进行了编辑,则希望它保持不变。

我的第一次尝试是将脚本放在单个单元格上,并且在编辑任何参数时都会自动调用该脚本。当前未使用onEdit()触发器。

function setDate(contrib, progress) {
 //contrib: the current assigned contributor
 //progress: cell showing progress state (Not started, begun, completed)

  var range = SpreadsheetApp.getActiveRange();
  var d = range.getValue(); 

  if(progress == 'Completed') { return 'done'; } 
  if(d instanceof Date) { return; }
  if(contrib == '') { return; }
//if progress is completed, it should always return done
//if there is already a date there, it should not change it
//if contrib is blank, as long as there wasn't already a date, we don't want to add one

  today = new Date();
  due = new Date();
  due.setDate(today.getDate() + 7); //one week from today
  return due;
}

问题是,当您编辑贡献者或进度状态时,它将到期日期单元格更改为“正在加载...”,因此我实际上无法检索原始内容。

我的第二个尝试是创建一个可以贯穿整列的函数。

  function setDueDate(contribR, dueR, progressR) {
    today = new Date();
    due = new Date();
    due.setDate(today.getDate() + 7); //one week from today
    dates = ["Due Date"];
    //the first value in array has to be "Due Date" because the script is placed in the title cell for that column, the cell above the due date column I want to edit

    for(var i = 0; i < dueR.length; i++) {
        if(progressR[i] == 'Completed') {
            dates.push('done');
        }
        else if(dueR[i] instanceof Date) {
            dates.push(dueR[i]);
        }
        else if(contribR[i] != '') {
            dates.push(dueR[i]);
        }
      else {
        dates.push('');
      }
    }

    return dates;

   }

尽管如此,这里的问题最终还是相似的。调用此脚本时,它将首先清除整个截止日期列,因此原始日期将丢失。

任何想法,技巧和建议都值得赞赏。

2 个答案:

答案 0 :(得分:1)

根据库珀的建议,我得出了最终代码:

function onEdit(e) {
    var sh=e.range.getSheet();
    if(sh.getName()!="MySheet") return;

    //if edited cell is in contributor column
    //and if there is not already a date in the due date column
    //then set the due date one week from today
    if(e.range.columnStart==9 && e.range.rowStart>=11 && e.value && e.value.length>0) {
      if((e.range.offset(0,1).getValue() instanceof Date) == false) {
        var td=new Date();
        var dd=new Date(td.getFullYear(),td.getMonth(),td.getDate()+7);    
        e.range.offset(0,1).setValue(Utilities.formatDate(dd, Session.getScriptTimeZone(), "MM/dd/yyyy"));
      }
    }

    //if edited cell is in the progress state column and state is "Completed"
    //then set due date cell to "Done"
    if(e.range.columnStart==10 && e.range.rowStart>=11 && e.value=="Completed") {
      e.range.offset(0,-1).setValue("Done");
    }


  }

如果删除了贡献者,我实际上并不想删除截止日期。 (“哦,昨天输错了我的名字,让我删除它,然后更正它。”到期日期不应该更改。)也不应该在每次更改进度状态时都设置新的到期日期。所以我只是从库珀的答案中删了这两部分。

答案 1 :(得分:0)

尝试一下:

您可能希望将工作表名称更改为所需的名称

function onEdit(e) {
  var sh=e.range.getSheet();
  if(sh.getName()!="Due Date")return;//limits actions to a sheet named Due Date
  if(e.range.columnStart==1 && e.range.rowStart>1 && e.value && e.value.length>0) {
    var td=new Date();
    var dd=new Date(td.getFullYear(),td.getMonth(),td.getDate()+7);    
    e.range.offset(0,2).setValue(Utilities.formatDate(dd, Session.getScriptTimeZone(), "MM/dd/yyyy"));
  }
  if(e.range.columnStart==1 && e.range.rowStart>1 && !e.value) { 
    e.range.offset(0,2).setValue('');
  }
  if(e.range.columnStart==2 && e.range.rowStart>1 && e.value=="Completed") {
    e.range.offset(0,1).setValue("Done");
  }
  if(e.range.columnStart==2 && e.range.rowStart>1 && e.value!="Completed") {
     var td=new Date();
    var dd=new Date(td.getFullYear(),td.getMonth(),td.getDate()+7);    
    e.range.offset(0,1).setValue(Utilities.formatDate(dd, Session.getScriptTimeZone(), "MM/dd/yyyy"));
  }
}

这是我的电子表格的外观:

enter image description here

我还在第二列中包含了用于数据验证的对话框。