如何从工作表复制行并将多个版本粘贴到另一个工作表中

时间:2017-01-13 20:09:44

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

我有一个独特的情况。我正在创建一个低技术的工作管理系统。我有一张工作单"工作订单"其中标题后面的每一行都包含一个工单。但是,工作单可能需要几天时间。因此,我需要一张单独的工作表,显示每个工单的每日任务。因此,例如,如果工作订单是从1/12/17到1/14/17,我想在另一个工作表中自动创建三行来表示每一天。目的是能够根据每个日常任务分配工作人员。

这是我到目前为止所写的内容,但承认我不确定错误在哪里,或者我是否关闭。我肯定是业余爱好者。

在此示例中," Word订单" sheet是我的源表," Schedule"是我的目标表,AD和AE是具有开始和结束日期的列,AI是我的条件,IF"是"对于onEdit。

function onEdit(event) {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var target = SpreadsheetApp.getActiveSpreadsheet()
  var source_sheet = ss.getSheetByName("Work Orders");
  var target_sheet = target.getSheetByName("Schedule");
  var source_range = source_sheet.getActiveRange().getRow();
  var startdate = source_sheet.getRange("AD"+(source_range));
  var enddate = source_sheet.getRange("AE"+(source_range));
  var duration = enddate - startdate + 1
  var event = (source_sheet.getRange("AI"+(source_range));
  var last_row = target_sheet.getLastRow();
  var target_range = target_sheet.getRange("A"+(last_row+1)+":AJ"+(last_row+1));

  if (source_sheet.getRange("AI"+(source_range)) == "Yes");
  target_sheet.insertRowAfter(last_row);
  source_range.copyTo(target_range);
  } 

我也不需要将它作为onEdit()触发器。我有一个我可以使用的自定义菜单项。我不需要有条件的"是"如果我使用这个选项,在AI中。

function onOpen() {

  SpreadsheetApp.getUi()
      .createMenu('Triggers')
      .addItem('Create Daily Task', 'CreateDailyTask')
      .addToUi();
};  

第一编辑:

最后,如果有办法让每个粘贴行的日期更改,以表明每个都是不同的,那将是锦上添花。

第二次编辑:

我还会提到,虽然不知道重要但是我的原始单"工作单"有一个自动排序的脚本:

/**
 * Automatically sorts the 30th column (not the header row) Ascending.
 */
function onEdit(event){
  var sheet = event.source.getSheetByName("Work Orders");
  var editedCell = sheet.getActiveCell();

  var columnToSortBy = 30;
  var tableRange = "A2:AJ"; // What to sort.

  if(editedCell.getColumn() == columnToSortBy){   
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy, ascending: true } );
  }
}

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

代码有错误,缺少所需的getValue方法。这是一个快速调整,以帮助您入门:

function CreateDailyTask() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var source_sheet = ss.getSheetByName("Work Orders");
  var target_sheet = ss.getSheetByName("Schedule");
  var source_range = source_sheet.getActiveRange();
  var source_row = source_range.getRow();
  var source_data = source_range.getValues();
  var startdate = source_sheet.getRange("AD"+(source_row)).getValue();
  var enddate = source_sheet.getRange("AE"+(source_row)).getValue();
  var duration = enddate - startdate + 1
  var event = (source_sheet.getRange("AI"+(source_row)).getValue());
  var last_row = target_sheet.getLastRow();
  var target_range = target_sheet.getRange("A"+(last_row+1)+":AJ"+(last_row+1));
  Logger.log(startdate+' '+enddate+' '+duration+' '+event); //use Logger to help you debug, this one puts the variables into the Logs (from View menu)

  if (source_sheet.getRange("AI"+(source_row)).getValue() == "Yes") {
    target_sheet.insertRowAfter(last_row);
    source_range.copyTo(target_range);
  }
}

注意 - 为了使其正常工作,您必须在工作订单表中选择整行数据。这看起来像是基于您的代码的预期工作流程,但是,我不确定这是否真的是意图。