2016-11-23 4 views
1

Я только начинаю обманывать с помощью скриптов Google и супер-новичком, поэтому, пожалуйста, несите меня здесь.Предельный скрипт для регистрации ячеек Изменения в определенных строках

настоящее время я использую эту формулу для регистрации изменений в определенный столбец в отдельной таблице:

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

    var target = targetSheet.getRange(targetSheet.getLastRow()+1,1); 

    s.getRange(row, 1, 1, numColumns).copyTo(target); 
    } 
} 

Но я хотел бы ограничить «» getRange только столбец А, столбец E, и колонки F (т. Е. Исключить столбцы B, C, D)

См. «Data Test» для справки.

Помощь?

+0

ты имеешь в виду только хотите скопировать столбцы A, E и F в строку назначения?Вы хотите, чтобы они были в тех же столбцах или в столбцах A-C? (У вас несколько вызовов getRange) –

ответ

1

Чтобы скопировать эти столбцы 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'; 
} 
1

Вы также можете использовать строку на добавление, поэтому вам не придется держать проверки, если последняя строка не более строка:

function onEdit() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = ss.getActiveSheet(); 
    var r = s.getActiveRange(); 

    if(s.getName() == "Sheet1" && r.getColumn() == 73 && r.getValue()) { 
    var row = r.getRow(); 
    var numColumns = s.getLastColumn(); 
    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]]) 
    } 
} 
Смежные вопросы