在谷歌脚本中使用数组查找和替换子字符串

时间:2017-01-24 20:11:38

标签: javascript google-apps-script

有没有办法改变这段代码,让它检查子串而不是整个单元格,也可以全局而不是每个单元格检查一次?我使用谷歌脚本来改变电子表格,必须找到并替换几十个术语。

我的javascript技能非常有限,并且已经搜索了所有可行的东西。我发现其他一些效率低下的代码,当我运行它时会超时,这样可行,但不包括子串或全局工作。它必须在全球范围内工作,因为我还需要替换","用";"当有超过2个国家时。

function findReplace() {
//create array
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getActiveSheet();
var lngLastRow = sheet1.getLastRow();
var lngLastCol = sheet1.getLastColumn();
var shValues = sheet1.getSheetValues(1,1,lngLastRow,lngLastCol);

//for each cell in shValues, perform replacement, and string trim
for (c=0;c<lngLastCol;c++){
for(r=1;r<lngLastRow;r++){
  if(shValues[r][c] != ""){
    var strString = String(shValues[r][c]); 
    var strHeading = String(shValues[0][c]);  

    if(strHeading.indexOf("Country of Origin") >-1 ){
      if(strString == "United Kingdom") (strString = "U.K.");

//set
    shValues[r][c] = strString;

  }
}

}

//set values
var range1 = sheet1.getRange(1,1,lngLastRow,lngLastCol);
range1.setValues(shValues);
}
}

编辑:
我试图替换国家名称,以使用另一组数据标准化它们。因此,英国成为英国,美国成为美国,所有的逗号&#34;,&#34;成为分号&#34;;&#34;。还有几个国家,而不是所有国家,但这是主要问题。 &#34;保加利亚,法国,美国&#34;成为&#34;保加利亚;法国; U.S&#34;

这是其他用于解决子字符串的代码,但是大约有一半时间,并且不会替换&#34;,&#34;的多个实例。为简洁起见,这只是该职能清单中的1/2国家。

function fandrCountrynames() {
// standardizes country names
var r=SpreadsheetApp.getActiveSheet().getRange("J2:K");
var rws=r.getNumRows();
var cls=r.getNumColumns();
var i,j,a,find,repl;
find="United States";
repl="U.S.";
for (i=1;i<=rws;i++) {
for (j=1;j<=cls;j++) {
  a=r.getCell(i, j).getValue();
  if (r.getCell(i,j).getFormula()) {continue;}
  try {
    a=a.replace(find,repl);
    r.getCell(i, j).setValue(a);
  }
  catch (err) {continue;}
}
}

 // standardizes country names
find="Korea; Republic of";
repl="South Korea";
for (i=1;i<=rws;i++) {
for (j=1;j<=cls;j++) {
  a=r.getCell(i, j).getValue();
  if (r.getCell(i,j).getFormula()) {continue;}
  try {
    a=a.replace(find,repl);
    r.getCell(i, j).setValue(a);
  }
  catch (err) {continue;}
}
}

   // standardizes country names

find="Not Specified";
repl=" ";
for (i=1;i<=rws;i++) {
for (j=1;j<=cls;j++) {
  a=r.getCell(i, j).getValue();
  if (r.getCell(i,j).getFormula()) {continue;}
  try {
    a=a.replace(find,repl);
    r.getCell(i, j).setValue(a);
  }
  catch (err) {continue;}
}
}


  // standardizes country names

find="Iran; Islamic Republic of";
repl="Iran";
for (i=1;i<=rws;i++) {
for (j=1;j<=cls;j++) {
  a=r.getCell(i, j).getValue();
  if (r.getCell(i,j).getFormula()) {continue;}
  try {
    a=a.replace(find,repl);
    r.getCell(i, j).setValue(a);
  }
  catch (err) {continue;}
}
}
}

1 个答案:

答案 0 :(得分:0)

编辑:这不完全正确,因为它是在看到一些解释情况的评论之前编写和发布的。第一部分仍然可以工作,但是需要遍历一组值来替换from和to。

下面一行将用字符串中的英国替换英国的任何实例(shValues [r] [c]):

var strString = String(shValues[r][c]).replace("United Kingdom", "U.K.");

要搜索文件中的所有单元格,您必须将表单加载到内存中并循环遍历它。

编辑:以下内容与OP基于OP中的评论无关,但留给其他人。

如果您希望在其他单元格中替换此文本,则可以使用标准Google表格公式 = SUBSTITUTE(text_to_search,search_for,replace_with,[occurrence_number]) 因此,要让单元格D2显示单元格C2的内容,替换上面相同的字符串,您将拥有:

=SUBSTITUTE(C2, "United Kingdom", "U.K.")

如果要在整个D列中应用此项,请将其放在单元格D2中:

=ARRAYFORMULA(IF(ISBLANK(C2:C),,SUBSTITUTE(C2:C, "United Kingdom", "U.K.")))

编辑2: 在下面的一些评论之后,我们来: 编辑后来提供的代码时,我发现你多次调用.getValue()。这会将请求发送回Google的服务器以读取每个呼叫的文件。这会使许多调用回服务器并导致超时。我们通过使用r.getValues()从工作表中读取所有必要的数据来限制这一点,以从范围r中提取所有值。在你的情况下,我们只抓取2列J和K.然后我们遍历这些数据并循环通过替换对象来改变所有国家:

function fandrCountrynames() {
  // standardizes country names

  //Define an Object of the replacement strings
  var country = [];
  country[0] = {searchFor: "Not Specified", replacement: " "};
  country[1] = {searchFor: "United Kingdom", replacement: "U.K."};
  country[2] = {searchFor: "United States", replacement: "U.S."};
  country[3] = {searchFor: "Korea; Republic of", replacement: "South Korea"};
  country[4] = {searchFor: "Iran; Islamic Republic of", replacement: "Iran"};

  //Read the items in the range below
  var sheet = SpreadsheetApp.getActiveSheet()
  var r = sheet.getRange("A2:B");
  var sheetData = r.getValues();

  //Loop through each row in the sheet
  for (var i = 0; i < sheetData.length; ++i) {
    //Loop through each repalcement string pair and save the replaced string back to the data object
    for (var j = 0; j < country.length; ++j) {
      var strString = sheetData[i][0].replace(country[j].searchFor, country[j].replacement);
      sheetData[i][0] = strString;
      strString = sheetData[i][1].replace(country[j].searchFor, country[j].replacement);
      sheetData[i][1] = strString;
    }
  }

  //Save the data back to the file
  r.setValues(sheetData);
}