首页 > 解决方案 > 如何将 SORT 和 Match google sheet 公式翻译成应用脚本/javascript?

问题描述

如何运行如下公式:

=sort(A2:F5000, match(B2:B5000,{"QTA 10 Days","QTA-REMAKE","QTA-SAMPLE","QTA NEW PROJECT","QTA NPI-CVF-Bryan","Qual-QTA-NPI Remake"},0),1)

使用 Google Apps Script API for Google Sheets 的一系列字段?

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


要对工作表进行排序,您可以使用以下代码:

function myFunction() {
  var inSheet = SpreadsheetApp.getActive().getSheets()[0];
  var outSheet = SpreadsheetApp.getActive().getSheets()[1];

  var values = inSheet.getRange('A2:C23').getValues();
  values.sort(mySort);

  outSheet.getRange('A2:C23').setValues(values);
}


function mySort(row1, row2) {
  var values = ["QTA 10 Days","QTA-REMAKE","QTA-SAMPLE","QTA NEW PROJECT","QTA NPI-CVF-Bryan","Qual-QTA-NPI Remake"];
  var val1 = values.indexOf(row1[2]);
  var val2 = values.indexOf(row2[2]);
  return val1 - val2;
}

您当然必须更改您正在使用的范围和/或工作表。我使用的 Sheets 文件就是这个文件,您可以在其中看到 Sheet1 中的原始值以及在 Sheet2 中运行我的脚本的输出。

基于起始模式子串的排序

要根据字符串是否以“QTA”开头进行排序,您可以将mySort我上面提供的函数替换为以下内容:

function mySort(row1, row2) {
  var val1 = row1[2];
  var val2 = row2[2];
  var qta1 = val1.indexOf("QTA") == 1;
  var qta2 = val2.indexOf("QTA") == 1;
  if (qta1 === qta2) return  strcmp(val1, val2);
  return qta1 ? 1 : -1;
}

function strcmp(a, b) {
  if (a.toString() < b.toString()) return -1;
  if (a.toString() > b.toString()) return 1;
  return 0;
}

此函数将优先考虑包含“QTA”的行,并且它还将比较字符串的其余部分以防两者都包含或都不包含子字符串。有关结果,请参阅我的测试表的 Sheet3。


推荐阅读