在Google脚本编辑器(Google表格)中按K列过滤数据

me9*_*867 3 javascript filter google-apps-script google-sheets-api

在此示例中,我从一组Google表格(4Cat)中获取了一组数据,这些数据又馈入了我正在运行Google脚本的另一张表格(ImportFeeder)中。

在下面的脚本结尾处,如何插入过滤器脚本以按行K排序数据?(仅显示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: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])
}
}
}
Run Code Online (Sandbox Code Playgroud)

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

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

进食

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

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

Ant*_*son 5

您可以将其添加到您的原始代码中:

filterByText(rawData, 10, iPad);
Run Code Online (Sandbox Code Playgroud)

只要在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

以上是Google Apps Script 的 ArrayLib 库的filterByText 方法使用的代码。我实际上只是复制了它并使投掷变得更友好。

您的完整代码可能如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


k4k*_*sh1 5

为什么不使用自定义过滤器功能?添加了一个.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";
};
Run Code Online (Sandbox Code Playgroud)

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

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

您甚至不需要以这种方式清除工作表。


Jac*_*own 3

您可以在此处找到有关在范围内排序的文档。要排序,请使用 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
Run Code Online (Sandbox Code Playgroud)

编辑 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. 
Run Code Online (Sandbox Code Playgroud)

编辑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);

}
Run Code Online (Sandbox Code Playgroud)