如何从 sheet 复制一行并将稍有改动的多个版本粘贴到另一个 sheet
How to copy a row from a sheet and paste multiple versions with minor changes to another sheet
我的情况很特殊。我正在创建一个 low-tech 工作管理系统。我有一个 sheet "Work Orders",其中 header 之后的每一行都包含一个工单。但是,工单可能长达数天。因此,我需要一个单独的 sheet 来显示每个工单的每个日常任务。因此,例如,如果工单是从 2017 年 1 月 12 日到 2017 年 1 月 14 日,我想在另一个 sheet 中自动创建三行来表示每一天。目的是能够根据每项日常任务分配工作人员。
这是我到目前为止所写的内容,但承认我不确定错误在哪里,或者我是否接近错误。我肯定是业余爱好者。
在此示例中,"Word Orders" sheet 是我的来源 sheet,"Schedule" 是我的目标 sheet,AD 和 AE 是具有开始和结束日期,AI 是我的条件,IF "Yes" for the 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 中的条件 "Yes"。
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Triggers')
.addItem('Create Daily Task', 'CreateDailyTask')
.addToUi();
};
第一次编辑:
最后,如果有一种方法可以让每个粘贴行的日期发生变化以表明每一行都是不同的,那将是锦上添花。
第二次编辑:
我还会提到,虽然我不知道这是否重要,但我的来源 sheet "Work orders" 有一个自动排序的脚本:
/**
* 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 } );
}
}
感谢任何帮助。
代码有错误,缺少所需的 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);
}
}
注意 - 为了使其工作,您必须在工单 sheet 中选择整行数据。根据您的代码,这看起来像是您预期的工作流程,不过,我不确定这是否真的是您的意图。
我的情况很特殊。我正在创建一个 low-tech 工作管理系统。我有一个 sheet "Work Orders",其中 header 之后的每一行都包含一个工单。但是,工单可能长达数天。因此,我需要一个单独的 sheet 来显示每个工单的每个日常任务。因此,例如,如果工单是从 2017 年 1 月 12 日到 2017 年 1 月 14 日,我想在另一个 sheet 中自动创建三行来表示每一天。目的是能够根据每项日常任务分配工作人员。
这是我到目前为止所写的内容,但承认我不确定错误在哪里,或者我是否接近错误。我肯定是业余爱好者。
在此示例中,"Word Orders" sheet 是我的来源 sheet,"Schedule" 是我的目标 sheet,AD 和 AE 是具有开始和结束日期,AI 是我的条件,IF "Yes" for the 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 中的条件 "Yes"。
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Triggers')
.addItem('Create Daily Task', 'CreateDailyTask')
.addToUi();
};
第一次编辑:
最后,如果有一种方法可以让每个粘贴行的日期发生变化以表明每一行都是不同的,那将是锦上添花。
第二次编辑:
我还会提到,虽然我不知道这是否重要,但我的来源 sheet "Work orders" 有一个自动排序的脚本:
/**
* 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 } );
}
}
感谢任何帮助。
代码有错误,缺少所需的 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);
}
}
注意 - 为了使其工作,您必须在工单 sheet 中选择整行数据。根据您的代码,这看起来像是您预期的工作流程,不过,我不确定这是否真的是您的意图。