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

How to get `indexOf()` cells value or convert an object to a String?

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

我的问题是我无法计算 indexOf() 的字数,因为它需要一个字符串,而 getValue()/getDisplayValue() 会生成一个 object/array。此外不支持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 而不是 google 脚本的解决方案。如果是这样,我很抱歉;否则,如果你能帮助我:谢谢! 干杯

如果您的代码无法正常工作Array IndexOf那么试试这个

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

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

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

由于您是在单独的行中搜索 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 将是一个二维数组,如下所示:

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

所以当你rowValue[0].join(" ")它return下面的值

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


}