如何获取 `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;
}
}
}
我的代码正在尝试 "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;
}
}
}