2016-09-07 76 views
0

我有一個功能,我從網上獲得,稍作修改爲我自己使用。我無法工作的是如何刪除整行,並只複製下面函數中的特定行。如何複製功能內的特定行而不是全行

我希望能夠將變量傳遞給每個工作表的功能以及其相應的列進行復制。

ex。 moveCompletedRows(類型,whereToMoveType,[細胞的移動]){}

function moveCompletedRows(type,whereToMoveType) { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName('SortBot'); 
    var targetSheet = ss.getSheetByName(whereToMoveType); 
    var val = sheet.getDataRange().getValues(); 
    var headers = val.shift(); 
    var arr = [], rowsToWriteBack = []; 

    rowsToWriteBack.push(headers); 

    val.forEach(function (r, i) { 
    r[1] == type ? arr.push(r) : rowsToWriteBack.push(r) 
    }); 

    if (arr.length > 0) { 
    targetSheet.getRange(targetSheet.getLastRow() + 1, 1, arr.length, arr[0].length) 
    .setValues(arr); 
    sheet.clear(); 
    sheet.getRange(1, 1, rowsToWriteBack.length, rowsToWriteBack[0].length) 
    .clear() 
    .setValues(rowsToWriteBack); 
    } 
} 

除了: 我的當前設置需要改變是因爲我的形式是如此之大(多部分形式)的原因提出了很多列的(A -CH),並且每個條目僅提交大約8個(僅在不同列中),即使隱藏了列,當我在移動設備上查看頁面時,它會凍結/崩潰50%的時間(我不確定這會完全解決因爲具有許多行的工作表仍將位於該主工作表上,請注意它將爲空)。這讓我質疑,如果在移動設備上從未查看過那麼多單元格的表單會導致表單加載非常慢?

感謝

編輯:

鏈接到包含窗體/張的雲端硬盤文件夾/腳本

https://drive.google.com/folderview?id=0B-7N8A7FPKw5V20yRVFQcmNZTlk&usp=sharing

EDIT2:

一直在努力工作在這最後幾個天,我有一個二次腳本我有半的工作,但部分下面標註是我想要的原配方中有工作

function onEdit() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet2Copy = ss.getSheetByName('Actions'); 
    var targetSheet = ss.getSheetByName('Test'); 

    var data = sheet2Copy.getRange(1,1, sheet2Copy.getLastRow(), sheet2Copy.getLastColumn()).getValues(); 

    var dest = []; 

    for (var i = 0; i < data.length; i++) { 

    Logger.log(data[i][12]);// just to check if the condition is true sometimes ;-) 

    if (data[i][1] == "Action") { 

     var rowsToWriteBack = []; // initialise intermediate array 

     // GET THIS WORKING IN ABOVE FORMULA 
     // Trying to select columns to put into new sheet. Will eventually make the #'s variables passed into the formula to make it dynamic 
     rowsToWriteBack.push(
     data[i][0], 
     data[i][1], 
     data[i][2], 
     data[i][10], 
     data[i][11], 
     data[i][12], 
     data[i][13] 
    );// choose here the columns you want to add 

     dest.push(rowsToWriteBack); 
    } 
    } // here is the end of the for loop 

    Logger.log(dest) ; // log the dest array instead 

    if (dest.length > 0) { // if something has been written in your array then batch write it to the dest. sheet 
    targetSheet.getRange(targetSheet.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest); 
    } 
} 
+0

我不是你完全清楚試圖做的是你試圖提取只填充行中的列或僅包含值的範圍的列?所需輸入和輸出的屏幕截圖會有所幫助。 –

+0

這個腳本不會真的有幫助。它會對電子表格進行排序,以查看第二列是否與某個文本/編號(第一個參數「type」)相對應。 –

+0

@RobinGertenbach我有一個非常大的表格,根據第一個問題被分成許多部分。表單的所有響應都轉到表單SortBot中,將它們排列到適當的表單選項卡中。問題是我的函數上面copys在行中的所有單元格(我需要告訴它type = inventory只複製列x,y,z。我試圖將列集分成不同的工作表,沒有所有的額外列,因爲它會導致Android上的大規模滯後和凍結。請注意,有些列將是空的,因爲它們將在發送響應之後填充 – Davey

回答

0

所以我無法得到它的工作直接關閉主表「SortBot」,並取得這麼SortBot所有單元寫入到旁邊另一片。然後是另一個腳本「moveToSheet」,它讀取新工作表並將所有所需列傳輸到新工作表。

我遇到的問題是發送到新窗體的所有響應,我無法監視更改並運行觸發器。因此,當響應進入時,我已經將單元格C2設置爲「未排序」,並且如果頁面已打開,請選擇C2(下拉列表),然後選擇「已排序」,然後對錶格進行排序。

如果有人想看看如何更系統的作品讓我知道,我打算讓我完成的系統的視頻演示供他人使用

// Main page running the code 
var responseRange = "A2:CJ"; 
    var targetSheetSortCell = "C2"; 
    var targetSheetSortCellValue = "Not sorted"; 

    var type1 = "Action"; 
    var sheetName1 = "Actions"; 
    var targetURL1 = "SHEET_URL"; 
    var columnsToCopy1 = [0,1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; 

    moveToSheet(type1, sheetName1, targetURL1, columnsToCopy1, responseRange, targetSheetSortCell, targetSheetSortCellValue) 


// The function 
function moveToSheet(type, sheet, targetURL, columnsToCopy, responseRange, targetSheetSortCell, targetSheetSortCellValue) { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet2Copy = ss.getSheetByName(sheet); 
    var target = SpreadsheetApp.openByUrl(targetURL) 
    var targetSheet = target.getSheetByName(sheet); 
    var columnsToCopy = columnsToCopy; 
    var responseRange = responseRange; 
    var targetSheetSortCell = targetSheetSortCell; 
    var targetSheetSortCellValue = targetSheetSortCellValue; 
    var data = sheet2Copy.getRange(1,1, sheet2Copy.getLastRow(), sheet2Copy.getLastColumn()).getValues(); 

    var dest = []; 

    for (var i = 0; i < data.length; i++) { 

    if (data[i][1] == type) { 

     var destRow = []; // initialise intermediate array 

     for (var v = 0; v < columnsToCopy.length; v++) { 
      destRow.push(data[i][columnsToCopy[v]]); 
     } 

     dest.push(destRow); 

     targetSheet.getRange(targetSheetSortCell).setValue(targetSheetSortCellValue); 
    } 
    } 

    if (dest.length > 0) { // if something has been written in your array then batch write it to the dest 
    sheet2Copy.getRange(responseRange).clear(); 

    targetSheet.getRange(targetSheet.getLastRow()+1,1,dest.length,dest[0].length).setValues(dest); 
    } 

} 
0

看看這個是什麼! 這將檢查每一行,只會取非空條目,並將結果放在工作表targetSheetName中。

function minimizeRows(sheetName,targetSheetName) { 
    // default sheetName is "test8" and default targetSheetName = "test-results"; 
    sheetName = sheetName ? sheetName : "test8"; 
    targetSheetName = targetSheetName ? targetSheetName : "test8-results"; 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName(sheetName) ? ss.getSheetByName(sheetName) : ss.insertSheet(sheetName); 
    var values = sheet.getDataRange().getValues(); 
    var headers = values.shift(); 

    // this adds the column name after each entry 
    for(var i=0;i<values.length;i++) { 
    for(var k=0;k<values[i].length;k++) { 
     if(values[i][k]) 
     values[i][k] = values[i][k] + " (column: " + headers[k] + ")"; 
    } 
    } 

    // this filters out only the non-empty entries 
    for(var i=0;i<values.length;i++) { 
    for(var k=0;k<values[i].length;k++) { 
     if(!values[i][k]) { 
     values[i].splice(k,1); 
     k--; // important to decrease k, because the row values[i] is decreased in size by one by split(k,1) 
     } 
    } 
    } 

    // this loop makes sure that every row will become the same length (the max length of a row) 
    var maxLengthOfRow = Math.max.apply(Math,values.map(function(item) { return item.length; })); 
    for(var i=0;i<values.length;i++) { 
    for(var k=0;k<maxLengthOfRow;k++) { 
     if(!values[i][k]) 
     values[i].push(""); // add empty entries to create the right length of the row 
    } 
    } 

    var targetSheet = ss.getSheetByName(targetSheetName) ? ss.getSheetByName(targetSheetName) : ss.insertSheet(targetSheetName); 
    targetSheet.getRange(targetSheet.getLastRow()+1,1,values.length,values[0].length).setValues(values); 
} 
+0

謝謝你的嘗試,但我也需要保留空列,並需要指定確切的列將表格的某些部分留空,然後在提交表格後輸入數據。 – Davey

+0

好吧,開始工作!;) –

相關問題