如何获取`indexOf()`单元格值或将对象转换为字符串?

时间:2018-01-29 13:42:05

标签: google-apps-script google-sheets google-docs

我的代码正试图"搜索"包含两个特定文本行的行的电子表格。当在前30行中找到该行时,A1:A1的值应该替换文档中的单词。

我的问题是我无法用indexOf()计算单词,因为它需要一个字符串而getValue()/getDisplayValue()会产生一个对象/数组。此外,不支持js' includes()。有人知道解决方案吗?

function myFunction1() {

var tss = DocumentApp.openById("targetspreadsheet");
var docBody = tss.getBody();  


var sourcess =  SpreadsheetApp.openById("source spreadsheet");
var sources  = sourcess.getSheets()[0]; 


  for (var i = 1; i = 30 ; i++){

    var rowValues = sources.getRange(i, 1, 1, sources.getLastColumn()).getDisplayValues();
    Logger.log(rowValues);

    if (rowValues.indexOf("Word1") >= 1 && rowValues.indexOf("Word2") >= 1){
      var name = sources.getRange("A1:A1").getValues();
      docBody.replaceText("TextToReplace", name)} 

    else {continue;}  

    }

}

也许我在搜索时忽略了一个解决方案,但到目前为止,我发现解决方案正在运行js而不是谷歌脚本。如果是的话,我很抱歉;否则,如果你能帮助我:谢谢! 干杯

2 个答案:

答案 0 :(得分:0)

如果您的代码无效Array IndexOf,请尝试使用

if (String(rowValues).indexOf("Word1") != -1 && String(rowValues).indexOf("Word2") -= -1)

注意我也改变了索引条件值。 String indexOf

如果您需要帮助,请告诉我。

答案 1 :(得分:0)

由于您要搜索2个特定单词的各个行,因此您可以使用Array.join()组合行中每个单词的值。例如:

rowValues[i].join(" ")

此外,不是通过循环获取每一行的值,而是可以一次获取所有30行的值,然后循环遍历它们,就像这样

var rowValues = sources.getRange(1, 1, 30, sources.getLastColumn()).getDisplayValues();
  for (var i = 0; i < 30 ; i++){ 
    Logger.log(rowValues[i].join(" "));}

优点是,开销较小。因此,更快地执行脚本和整体的良好实践。 rowValues将是一个2D数组,如下所示:

  rowValues = [["Row1Col1","Row1Col2",... ,"Row1ColLast"],
              ["Row2Col1",...,"Row2ColLast"],
              ...
              ...
              ["Row30Col1",....,"Row30ColLast"]]  // End of array

因此,当您执行rowValue[0].join(" ")时,它会返回以下值

rowValue[0].join(" ") => "Row1Col1 Row1Col2 ...  Row1ColLast"

这是一个字符串,可以使用indexOf()进行搜索。所以你的最终代码看起来像这样:

function myFunction1() {

var tss = DocumentApp.openById("targetspreadsheet");
var docBody = tss.getBody();  


var sourcess =  SpreadsheetApp.openById("source spreadsheet");
var sources  = sourcess.getSheets()[0]; 


 var name = sources.getRange("A1").getValue();
 var rowValues = sources.getRange(1, 1, 30, sources.getLastColumn()).getDisplayValues();
  for (var i = 0; i < 30 ; i++){ 
    Logger.log(rowValues[i].join(" "));
    if (rowValues[i].join(" ").indexOf("Word1") >= 1 && rowValues[i].join(" ").indexOf("Word2") >= 1){
      Logger.log("found Text "+name)
      docBody.replaceText("TextToReplace", name)
    }
    else {
      continue;
    }  
  }


}