2016-11-23 3 views
1

Google Scriptsと超初心者をばかにし始めているので、ここで私に同行してください。セルの変更を特定の行に記録するためのスクリプトを制限する

私は現在、別のスプレッドシートの特定の列への変更をログに記録し、この式を使用しています:

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

しかし、私は唯一の列A、列Eに「getRange」を制限するために好きで、コラムと思いますF(すなわち、列B、C、Dを除外する)

参照のために「Data Test」を参照してください。

ヘルプ?

+0

をあなただけを意味するかはtehのリンクチュートリアルから必要なコードを含んでいます列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でObjectを使うことを見たいでしょう。私はコードに柔軟性を追加するためにそれを言及します。列をハードコーディングしても問題ありません。

EDIT: 一つに自分のコードの3行を入れ、行の特定の列に値を追加するための興味深い方法@utphx応答を見ます。だからではなく、

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は値を取得する代わりにする一つの呼び出しを行う、行全体を読んでから返されますそれはコンマの間に、各セルの内容を定義し、ハードトンを得ることができるよう、私は、しかし、列の多いシート上でこれを使用することはできません

//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]]); 

:私は私の元の応答で行った3続く。だから、列Yに項目を追加すると大括弧で囲まれます。 "それは基本的に読み取ります:列の多くのスプレッドシートで

targetSheet.appendRow([column_A_Value,column_B_Value,column_C_Value,column_D_Value,column_E_Value,column_F_Value]); 

が、私は間違いなくgetRowsData()関数を作成するために、上記のチュートリアルからの情報を使用します。ターゲットシートにヘッダー行を作成すると、次のコードでいずれかのシート(タブ)から列などを挿入または並べ替えることができます。以下は、より柔軟なソリューションになります。私はそれがより効率的であると主張しているわけではなく、エラーチェックもなく、より柔軟性があります。最後の行が最大の行である場合は、チェックを維持する必要はありませんので、あなたはまた、APPEND行を使用することができます

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]]) 
    } 
} 
関連する問題