簡體   English   中英

使用Google腳本中的數組查找和替換子字符串

[英]Find and replace substrings using an array in google scripts

有沒有一種方法可以更改此代碼,以使其檢查子字符串而不是整個單元格,還可以全局而不是每個單元格一次? 我正在使用Google腳本來更改電子表格,並且不得不查找和替換數十個術語。

我的JavaScript技能非常有限,並且在各處搜索了一些可行的方法。 我發現一些其他代碼效率低下,並且在運行時會超時,這可以工作,但不包含子字符串或全局工作。 它必須在全球范圍內工作,因為我還需要將“,”替換為“;”。 當有兩個以上的國家時。

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

編輯:
我正在嘗試替換國家/地區名稱,以使用另一組數據對其進行標准化。 因此,英國成為英國,美國成為美國,所有逗號“,”成為分號“;”。 還有其他幾個國家,但不是全部,但這是主要問題。 “保加利亞,法國,美國”變為“保加利亞;法國;美國”

這是DOES處理子字符串的其他代碼,但是它們在中途超時,並且不會替換多個“,”實例。 為簡便起見,此功能僅是列表中國家的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;}
}
}
}

編輯 :這是不完全正確的,因為它是在看到更多解釋情況的評論之前被編寫和發布的。 第一部分仍然可以工作,但是需要遍歷一組值來替代from和to。

下面的行將String(shValues [r] [c])中的UK替換為UK的任何實例:

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

要搜索文件中的所有單元格,您必須將工作表加載到內存中並循環遍歷。

編輯 :以下內容與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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM