2016-09-07 2 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% времени (я не уверен, что это полностью решит это, поскольку лист со многими строками будет по-прежнему находиться на этом листе мастера, обратите внимание, что он будет пустым). Что заставляет меня сомневаться, если просто наличие листа с таким количеством ячеек, которое никогда не просматривается на мобильном устройстве, заставляет лист загружаться очень медленно?

Благодаря

Edit:

Ссылка на Диске, содержащую форму/лист/скрипт

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, который сортирует их на соответствующие вкладки листа. Проблема заключается в моей функции над копиями по всем ячейкам в строке (и мне нужно сказать это для типа = инвентарь только для копирования по столбцам x, y, z. Я пытаюсь разделить столбцы на разные листы без дополнительных столбцы, поскольку он вызывает значительное отставание в андроиде и зависает. Обратите внимание, что некоторые столбцы будут пустыми, поскольку они будут заполнены после отправки ответа. – Davey

ответ

0

Так что я не смог заставить его работать непосредственно с главного листа «SortBot» и сделал это так SortBot записывает все ячейки на другом листе рядом с ним. Затем еще один скрипт «moveToSheet», который считывает новый лист и переносит все нужные столбцы на новый лист.

Проблема, с которой я столкнулся, - это все ответы, которые отправляются в новую форму. Я не могу следить за изменениями и запускать триггер. Поэтому я установил ячейку C2 как «Не отсортированную», когда приходит ответ, и если страница открыта, вы выбираете C2 (Dropdown) и выбираете «Sorted», а затем сортируете лист.

Если кто-то хочет посмотреть, как больше работает система, дайте мне знать, я планирую сделать видеоруководство моей готовой системы для использования другого

// 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

Ну, приступайте к работе!;) –

Смежные вопросы