Чтобы скопировать эти столбцы A, E и F на новое место вы могли бы сделать это:
function onEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "Sheet1" && r.getColumn() == 73 && r.getValue()) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Quarterly Report");
if(targetSheet.getLastRow() == targetSheet.getMaxRows()) {
targetSheet.insertRowAfter(targetSheet.getLastRow());
}
//Changes Start Here
var myRow = targetSheet.getLastRow()+1;
s.getRange(row, 1).copyTo(targetSheet.getRange(myRow,1));
s.getRange(row, 5).copyTo(targetSheet.getRange(myRow,5));
s.getRange(row, 6).copyTo(targetSheet.getRange(myRow,6));
}
}
что жесткие коды расположения копии. Измените 1, 5 и 6, если вам нужны данные в разных столбцах. Вы также можете использовать код in this tutorial для лучшего определения столбцов и данных для хранения. Часть ниже
//////////////////////////////////////////////////////////////////////////////////////////
//
// The code below is reused from the 'Reading Spreadsheet data using JavaScript Objects'
// tutorial.
//
//////////////////////////////////////////////////////////////////////////////////////////
считывает данные из таблицы и вы можете получить к использованию первой строки в качестве заголовка в простынях, чтобы получить и поместить данные в столбцах на основе этого в коде. Вы бы хотели посмотреть на использование объектов в javascript, чтобы использовать это. Я только упоминаю об этом, чтобы добавить flexibilty в код. Это не обязательно, если вы хорошо кодируете столбцы.
EDIT: См @utphx ответа на интересный способ добавления значения в определенные столбцы в строке, поставив 3 строки моего кода в один. Таким образом, вместо
s.getRange(row, 1).copyTo(targetSheet.getRange(myRow,1));
s.getRange(row, 5).copyTo(targetSheet.getRange(myRow,5));
s.getRange(row, 6).copyTo(targetSheet.getRange(myRow,6));
мы могли бы использовать
targetSheet.appendRow([s.getRange(row, 1).getValue(),"","","",s.getRange(row, 5).getValue(),s.getRange(row, 6).getValue()]);
Далее, captilaize на скорости он получает с помощью его использования объекта вернулся из прочтения всей строки, что делает один вызов для извлечения значения вместо 3 я сделал в своей первоначальной реакции:
//Retrieve the values if the entire row
var source = s.getRange(row, 1, 1, numColumns).getValues();
var targetSheet = ss.getSheetByName("Quarterly Report");
targetSheet.appendRow([source[0][0],"","","",source[0][4],source[0][5]]);
Я не могу использовать это на листах с большим количеством колонн, хотя, как он определяет содержимое каждой ячейки между запятыми и может получить жесткий т o следовать. Поэтому, добавляя элемент в столбец Y, вы получаете много «внутри» скобок. Это в основном читает:
targetSheet.appendRow([column_A_Value,column_B_Value,column_C_Value,column_D_Value,column_E_Value,column_F_Value]);
В таблице с большим количеством столбцов, я бы определенно использовать информацию из вышеупомянутого учебника, чтобы создать функцию getRowsData(). Создайте строку заголовка в своем целевом листе, и следующий код позволит вам вставлять или изменять порядок столбцов и т. Д. С любого листа (вкладки). Таким образом, ниже становится более гибкое решение. Я не утверждаю, что он более эффективен и не проверяет ошибок, просто более гибким. Она включает в себя необходимый код из ТЕХ связанного учебника:
function onEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
// var s =ss.getSheetByName("Current");
var r = ss.getActiveRange();
if(s.getName() == "Current" && r.getColumn() == 5 && r.getValue()) {
var row = r.getRow();
var rowIndex = row - 1;
var numColumns = s.getLastColumn();
var sourceRange = s.getRange(1, 1, row, numColumns);
// Create one JavaScript object per row of data from the Source data (the Current tab)
var data = getRowsData(s, sourceRange, 1);
// Create a JavaScript object for the Target data (the Quarterly Report tab)
var targetSheet = ss.getSheetByName("Quarterly Report");
var numRows = targetSheet.getLastRow();
numColumns = targetSheet.getLastColumn();
var targetRange = s.getRange(1, 1, 1, numColumns);
var targetHeaders = targetSheet.getDataRange().getValues().shift();
var saveData = createArray(numColumns, null);
//Save the data we will be adding to teh Target in the proper locations in the array
saveData[targetHeaders.indexOf('Name')] = data[rowIndex].name;
saveData[targetHeaders.indexOf('Subsidy')] = data[rowIndex].subsidy;
saveData[targetHeaders.indexOf('Last Update')] = data[rowIndex].lastUpdate;
//Save the data to teh Target
targetSheet.appendRow(saveData);
}
}
//Create an array with a given number of items and a given common value
function createArray(len, itm) {
var arr1 = [itm],
arr2 = [];
while (len > 0) {
if (len & 1) arr2 = arr2.concat(arr1);
arr1 = arr1.concat(arr1);
len >>>= 1;
}
return arr2;
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// The code below is reused from the 'Reading Spreadsheet data using JavaScript Objects'
// tutorial.
//
//////////////////////////////////////////////////////////////////////////////////////////
// getRowsData iterates row by row in the input range and returns an array of objects.
// Each object contains all the data for a given row, indexed by its normalized column name.
// Arguments:
// - sheet: the sheet object that contains the data to be processed
// - range: the exact range of cells where the data is stored
// - columnHeadersRowIndex: specifies the row number where the column names are stored.
// This argument is optional and it defaults to the row immediately above range;
// Returns an Array of objects.
function getRowsData(sheet, range, columnHeadersRowIndex) {
columnHeadersRowIndex = columnHeadersRowIndex || range.getRowIndex() - 1;
var numColumns = range.getEndColumn() - range.getColumn() + 1;
var headersRange = sheet.getRange(columnHeadersRowIndex, range.getColumn(), 1, numColumns);
var headers = headersRange.getValues()[0];
return getObjects(range.getValues(), normalizeHeaders(headers));
}
// For every row of data in data, generates an object that contains the data. Names of
// object fields are defined in keys.
// Arguments:
// - data: JavaScript 2d array
// - keys: Array of Strings that define the property names for the objects to create
function getObjects(data, keys) {
var objects = [];
for (var i = 0; i < data.length; ++i) {
var object = {};
var hasData = false;
for (var j = 0; j < data[i].length; ++j) {
var cellData = data[i][j];
if (isCellEmpty(cellData)) {
continue;
}
object[keys[j]] = cellData;
hasData = true;
}
if (hasData) {
objects.push(object);
}
}
return objects;
}
// Returns an Array of normalized Strings.
// Arguments:
// - headers: Array of Strings to normalize
function normalizeHeaders(headers) {
var keys = [];
for (var i = 0; i < headers.length; ++i) {
var key = normalizeHeader(headers[i]);
if (key.length > 0) {
keys.push(key);
}
}
return keys;
}
// Normalizes a string, by removing all alphanumeric characters and using mixed case
// to separate words. The output will always start with a lower case letter.
// This function is designed to produce JavaScript object property names.
// Arguments:
// - header: string to normalize
// Examples:
// "First Name" -> "firstName"
// "Market Cap (millions) -> "marketCapMillions
// "1 number at the beginning is ignored" -> "numberAtTheBeginningIsIgnored"
function normalizeHeader(header) {
var key = "";
var upperCase = false;
for (var i = 0; i < header.length; ++i) {
var letter = header[i];
if (letter == " " && key.length > 0) {
upperCase = true;
continue;
}
if (!isAlnum(letter)) {
continue;
}
if (key.length == 0 && isDigit(letter)) {
continue; // first character must be a letter
}
if (upperCase) {
upperCase = false;
key += letter.toUpperCase();
} else {
key += letter.toLowerCase();
}
}
return key;
}
// Returns true if the cell where cellData was read from is empty.
// Arguments:
// - cellData: string
function isCellEmpty(cellData) {
return typeof(cellData) == "string" && cellData == "";
}
// Returns true if the character char is alphabetical, false otherwise.
function isAlnum(char) {
return char >= 'A' && char <= 'Z' ||
char >= 'a' && char <= 'z' ||
isDigit(char);
}
// Returns true if the character char is a digit, false otherwise.
function isDigit(char) {
return char >= '0' && char <= '9';
}
ты имеешь в виду только хотите скопировать столбцы A, E и F в строку назначения?Вы хотите, чтобы они были в тех же столбцах или в столбцах A-C? (У вас несколько вызовов getRange) –