如何只复制函数内的特定行而不是整行

How to copy only specific rows inside function instead of full row

我有一个功能是从网上获得的,并稍作修改以供我自己使用。我无法开始工作的是如何删除整行并只复制下面函数中的特定行。

我希望能够将每个 sheet 及其对应列的变量传递给函数以进行复制。

例如。 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 个(只是在不同的列中),即使隐藏了列,当我在 freezes/crashes 50% 的时间在移动设备上查看页面(我不确定这是否会完全解决它,因为有很多行的 sheet 仍然在那个主 sheet 上,请注意它将为空白)。这让我产生疑问,如果 sheet 包含那么多从未在移动设备上查看过的单元格,是否会导致 sheet 加载速度非常慢?

谢谢

编辑:

Link 到包含 form/sheet/ 脚本的 Drive 文件夹

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

编辑2:

最近几天我一直在努力解决这个问题,我有一个辅助脚本,我已经半工作了,但下面标记的部分是我想在原始公式中工作的部分

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

看看这个! 这将检查每一行,并且只接受非空条目,并将结果放入 sheet 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);
}

所以我无法让它直接从主 sheet "SortBot" 开始工作,所以 SortBot 将所有单元格写入它旁边的另一个 sheet。然后另一个脚本 "moveToSheet" 读取新的 sheet 和 t运行 将所有需要的列转移到新的 sheet.

我 运行 遇到的一个问题是发送到新表单的所有响应我无法观察更改和 运行 触发器。因此,当收到响应并且页面打开时,我将单元格 C2 设置为 "Not sorted" select C2 (Dropdown) 和 select "Sorted" 然后它将对 sheet.

进行排序

如果有人想了解该系统的更多功能,请告诉我,我正计划制作我完成的系统的视频演练供其他人使用

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

}