Скрипт для установки срока оплаты за неделю с сегодняшнего дня, когда ячейка редактируется - PullRequest
1 голос
/ 31 октября 2019

Как видно из заголовка, я добавляю дату оплаты через одну неделю с сегодняшнего дня в ячейку, когда редактируется одна из двух смежных ячеек. Первая ячейка является вкладчиком, поэтому, когда кто-то назначен на задачу, устанавливается срок выполнения. Вторая ячейка - это статус завершения, поэтому, если задание установлено на «Завершено», оно изменит ячейку срока выполнения на «выполнено».

Я не хочу, чтобы это изменилось при изменении текущей даты. Также хочу, чтобы он оставался прежним, если автор редактируется позже.

В моей первой попытке был скрипт для отдельных ячеек, и он автоматически вызывался при редактировании любого из параметров. В настоящее время не используется триггер 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 ]

1 голос
/ 31 октября 2019

Окончательный код, который я придумал, основан на предложении Купера:

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");
    }


  }

На самом деле я не хочу стереть дату оплаты, если автор удален. («О, вчера я набрал опечатку, позвольте мне просто удалить это и затем исправить.» Дата выполнения не должна меняться.) Она также не должна устанавливать новую дату выполнения каждый раз, когда изменяется состояние выполнения. Поэтому я просто вырезал эти две части из ответа Купера.

0 голосов
/ 31 октября 2019

попробуйте это:

Возможно, вы захотите изменить имя листа на то, что вам нужно

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

Я также включил диалог проверки данных во втором столбце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...