2017-04-20 76 views
2

在本例中,我有一组来自Google Sheet(4Cat)的数据供给另一个工作表(ImportFeeder),我在其中运行我的Google脚本。在Google脚本编辑器(Google表格)中按列K过滤数据

在下面的脚本末尾,如何插入过滤器脚本来按行K排序数据? (仅示出iPad产品)

enter image description here

function myFunction() { 
var sss = SpreadsheetApp.openById('1kL96dRm3Z8XBtMXnSzUARxR1b34-njlkZQ1sU0c3g1s'); //replace with source ID 
var ss = sss.getSheetByName('4cat'); //replace with source Sheet tab name 
var range = ss.getRange('A:I'); //assign the range you want to copy 
var data = range.getValues(); 

var tss = SpreadsheetApp.openById('1u7547KaniKHLUJn2v-ezN4l8ZcxE4viCFcoxsA904MI'); //replace with destination ID 
var ts = tss.getSheetByName('Sheet1'); //replace with destination Sheet tab name 
ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data); 

var range = ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length) 
var rawData = range.getValues()  // get value from spreadsheet 2 
var data = []      // Filtered Data will be stored in this array 
for (var i = 0; i< rawData.length ; i++){ 
if(rawData[i][10] == "iPad")   // Check to see if column K says ipad if not skip it 
{ 
data.push(rawData[i]) 
} 
} 
} 

(无法读取未定义的属性长度)

4Cat示例数据https://docs.google.com/spreadsheets/d/1kL96dRm3Z8XBtMXnSzUARxR1b34-njlkZQ1sU0c3g1s/edit?usp=sharing */

送入

ImportFeeder https://docs.google.com/spreadsheets/d/1u7547KaniKHLUJn2v-ezN4l8ZcxE4viCFcoxsA904MI/edit?usp=sharing

必需 - 成功执行表单导入,按行K在Google脚本中过滤数据。在脚本的顶部添加一个清除()工作表功能,因为这将每天运行,并且在每日导入之前需要清除表单。

+2

您想筛选或排序?过滤除去特定值或按字母顺序排序除去所有内容? –

+0

这是我需要通过谷歌脚本的过滤器,而不是排序 – me9867

+0

您是否只想将第一个电子表格中的特定数据子集复制到第二个电子表格(与第k列中的iPad)? –

回答

3

你可以在sorting in a range here找到文件。排序使用getRange选择一个范围,然后进行排序的功能,像这样

var range = ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length) 
// Use the below line instead, if you want to sort whole sheet, not just the newly entered data! 
// var range = ts.getDataRange()  
range.sort(11)   // sort based on column number 11 

编辑1: 要过滤基于列复制到新的工作表,你会做需要修剪你的数据只值从一张你不需要的所有值中选择。

var rawData = range.getValues()  // get value from spreadsheet1 
var data = []      // Filtered Data will be stored in this array 
for (var i = 0; i< rawData.length ; i++){ 
if(rawData[i][10] == "iPAD")   // Check to see if column K says ipad if not skip it 
{ 
data.push(rawData[i]) 
} 
} 
// Now you can paste array data to your new spreadsheet like before. 

编辑2:这最后的代码应该看起来怎么样,

function myFunction() { 
var sss = SpreadsheetApp.openById('1kL96dRm3Z8XBtMXnSzUARxR1b34-njlkZQ1sU0c3g1s'); //replace with source ID 
var ss = sss.getSheetByName('4cat'); //replace with source Sheet tab name 
var range = ss.getRange('A:V');  //assign the range you want to copy 
var rawData = range.getValues()  // get value from spreadsheet 1 
var data = []      // Filtered Data will be stored in this array 
for (var i = 0; i< rawData.length ; i++){ 
if(rawData[i][10] == "iPad")   // Check to see if column K says ipad if not skip it 
{ 
data.push(rawData[i]) 
} 
} 
var tss = SpreadsheetApp.openById('1u7547KaniKHLUJn2v-ezN4l8ZcxE4viCFcoxsA904MI'); //replace with destination ID 
var ts = tss.getSheetByName('Sheet1'); //replace with destination Sheet tab name 
ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data); 

} 
+0

编辑时得到此错误2,--------- TypeError:无法读取属性“未定义的”长度“。 (第15行,文件“代码”) – me9867

+0

哪一行完全不是:“15” –

+0

也尝试将此行更改为if(rawData [i] [10] ==“iPAD”)'if(rawData [i ] [10] ==“iPad”)'注意大小写变为小写字母 –

0

,你可以添加到您的原代码:只要

filterByText(rawData, 10, iPad); 

它将工作您在myFunction功能之后添加此功能:

function filterByText(data, columnIndex, values) { 
    var value = values; 
    if (data.length > 0) { 
     if (typeof columnIndex != "number" || columnIndex > data[0].length) { 
      throw "Please, can you choose a valid column index?"; 
     } 
     var r = []; 
     if (typeof value == "string") { 
      var reg = new RegExp(escape(value).toUpperCase()); 
      for (var i = 0; i < data.length; i++) { 
       if (columnIndex < 0 && escape(data[i].toString()).toUpperCase().search(reg) != -1 || columnIndex >= 0 && escape(data[i][columnIndex].toString()).toUpperCase().search(reg) != -1) { 
        r.push(data[i]); 
       } 
      } 
      return r; 
     } else { 
      for (var i = 0; i < data.length; i++) { 
       for (var j = 0; j < value.length; j++) { 
        var reg = new RegExp(escape(value[j]).toUpperCase()); 
        if (columnIndex < 0 && escape(data[i].toString()).toUpperCase().search(reg) != -1 || columnIndex >= 0 && escape(data[i][columnIndex].toString()).toUpperCase().search(reg) != -1) { 
         r.push(data[i]); 
         j = value.length; 
        } 
       } 
      } 
      return r; 
     } 
    } else { 
     return data; 
    } 
} 

以上是Google Apps脚本的ArrayLib库filterByText method使用的code。我简直就是抄袭了它,并且让它更友好。为什么不使用自定义过滤功能

function myFunction() { 
    var sss = SpreadsheetApp.openById('1kL96dRm3Z8XBtMXnSzUARxR1b34-njlkZQ1sU0c3g1s'); //replace with source ID 
    var ss = sss.getSheetByName('4cat'); //replace with source Sheet tab name 
    var range = ss.getRange('A:I'); //assign the range you want to copy 
    var data = range.getValues(); 

    var tss = SpreadsheetApp.openById('1u7547KaniKHLUJn2v-ezN4l8ZcxE4viCFcoxsA904MI'); //replace with destination ID 
    var ts = tss.getSheetByName('Sheet1'); //replace with destination Sheet tab name 
    ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data); 

    var range = ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length) 
    var rawData = range.getValues()  // get value from spreadsheet 2 
    var data = filterByText(rawData, 10, iPad); // rawData is now sorted. 
    range.clear(); 

    var powerRange = ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length); 

    powerRange.setValues(data); 
} 

function filterByText(data, columnIndex, values) { 
    var value = values; 
    if (data.length > 0) { 
     if (typeof columnIndex != "number" || columnIndex > data[0].length) { 
      throw "Please, can you choose a valid column index?"; 
     } 
     var r = []; 
     if (typeof value == "string") { 
      var reg = new RegExp(escape(value).toUpperCase()); 
      for (var i = 0; i < data.length; i++) { 
       if (columnIndex < 0 && escape(data[i].toString()).toUpperCase().search(reg) != -1 || columnIndex >= 0 && escape(data[i][columnIndex].toString()).toUpperCase().search(reg) != -1) { 
        r.push(data[i]); 
       } 
      } 
      return r; 
     } else { 
      for (var i = 0; i < data.length; i++) { 
       for (var j = 0; j < value.length; j++) { 
        var reg = new RegExp(escape(value[j]).toUpperCase()); 
        if (columnIndex < 0 && escape(data[i].toString()).toUpperCase().search(reg) != -1 || columnIndex >= 0 && escape(data[i][columnIndex].toString()).toUpperCase().search(reg) != -1) { 
         r.push(data[i]); 
         j = value.length; 
        } 
       } 
      } 
      return r; 
     } 
    } else { 
     return data; 
    } 
} 
0

你完整的代码可能是这个样子? 增加了一个.toLowerCase()以匹配“ipad”不区分大小写。

function myFunction() { 
var sss = SpreadsheetApp.openById('1kL96dRm3Z8XBtMXnSzUARxR1b34-njlkZQ1sU0c3g1s'); //replace with source ID 
var ss = sss.getSheetByName('4cat'); //replace with source Sheet tab name 
var range = ss.getRange('A:V');  //assign the range you want to copy 
var rawData = range.getValues()  // get value from spreadsheet 1 
var data = rawData.filter(isColKiPad); // Filtered Data will be stored in this array 
var tss = SpreadsheetApp.openById('1u7547KaniKHLUJn2v-ezN4l8ZcxE4viCFcoxsA904MI'); //replace with destination ID 
var ts = tss.getSheetByName('Sheet1'); //replace with destination Sheet tab name 
ts.getRange(2,1,ts.getLastRow() - 1,ts.getLastColumn()).clear(); // Assuming header is in the first row, clears sheet but header 
ts.getRange(2, 1, data.length, data[0].length).setValues(data); 
}; 
// Change both to ts.getRange(1,1,[...] if there's no header row 
function isColKiPad(arr) { 
    return arr[10].toLowerCase() == "ipad"; 
}; 

您是否考虑使用电子表格公式?你可以尝试的=IMPORTRANGE(spreadsheet_key, string_range)QUERY(data, query, [header])组合导入已过滤出的范围:

=QUERY(IMPORTRANGE("1kL96dRm3Z8XBtMXnSzUARxR1b34-njlkZQ1sU0c3g1s";"4cat!A:V");"SELECT * WHERE Col11 = 'iPad'") 

你甚至不会需要清除表这种方式。

相关问题