搜索一个值,如果存在一个值,添加一行并在谷歌电子表格中复制数据

Posted

技术标签:

【中文标题】搜索一个值,如果存在一个值,添加一行并在谷歌电子表格中复制数据【英文标题】:Searching for a value and if a value exists adding a row with copying the data in google spreadsheet 【发布时间】:2020-07-22 22:19:46 【问题描述】:

我想在某个列中搜索一个单词,然后如果该值存在,我想复制下面的行及其值并将该单词更改为两个不同的单词。 我的问题是让找到的单词行号在其下方插入一行。

function myFunction() 
var ss = SpreadsheetApp.openById("1fE404JUbw3aytlqtoht6FfrIhYhTpSe2MM5UDnBkFc4");
var sheet = ss.getSheets()[0]
let range = sheet.getDataRange();
var values = range.getValues();
var typeRange = sheet.getRange("E2:E");
var typeValues = typeRange.getValues();

  var i;
  for(i = 0; i <= lastRow ; i++)
    for (let type of typeValues)
      if (type == "Both")
        var bothRow = i+1;
        
      
////      var bothRow = sheet.getRange(i+1,1,1,typeValues[i].length);
////      ss.insertRowsAfter(bothRow, 1);
    
  

我使用 alert 进行检查,它在第 1 行之后插入了无数行。

function myFunction() 
  
  let sheetui= SpreadsheetApp.getUi()
  sheetui.createMenu("Rahaf Game")
  .addItem("Stage 1", 'pop')
  .addToUi();
  
//  var ss = SpreadsheetApp.openById("1fE404JUbw3aytlqtoht6FfrIhYhTpSe2MM5UDnBkFc4");
//  var sheet = ss.getSheets()[0]
//  let range = sheet.getDataRange();
//  var values = range.getValues();
//  var typeRange = sheet.getRange("E2:E");
//  var typeValues = typeRange.getValues();

  function pop()
  //var ss = SpreadsheetApp.openById("1fE404JUbw3aytlqtoht6FfrIhYhTpSe2MM5UDnBkFc4");
  var sheet = ss.getSheets()[0]
  var typeRange = sheet.getRange("E2:E");
  var typeValues = typeRange.getValues();
  var lastRow = sheet.getLastRow();
  var i;
  for(i = 0; i <= lastRow ; i++)
    for (let type of typeValues)
      if (type == "Both")
        var bothRow = i+1;
        ss.insertRowsAfter(bothRow, 1);
      
////      var bothRow = sheet.getRange(i+1,1,1,typeValues[i].length);
////      ss.insertRowsAfter(bothRow, 1);
    
  

有人可以帮助实现在下面插入一行并将值复制到其中并将单词更改为两个单词来实现所需的结果吗?

【问题讨论】:

有什么问题?正在发生的事情代替应该发生的事情?有什么错误吗? 我注意到它是 bot 进入 if 条件! 【参考方案1】:

答案:

.getValues() 返回一个二维值数组,您在引用它时就好像它是一维的一样。

代码修复:

您需要更改条件,以便您检查的对象是一个数组:

if (type == "Both")
//code

应该是:

if (type == ["Both"])
//code

添加一行并将数据复制到其中:

您可以使用insertRowsAfter() 在给定行之后在工作表中添加一行,并使用.getRange().setValues() 复制数据:

for(var i = 0; i <= lastRow ; i++)
  for (let type of typeValues)
    if (type == ["Both"])
      var bothRow = i + 1;
      ss.insertRowsAfter(bothRow, 1);
      // increment lastRow as there is now one more row in the sheet
      lastRow++;
      // increment i as you want to skip the row you just copied!
      i++;
      var rangeToCopy = sheet.getRange(bothRow + ':' + bothRow).getValues();
      sheet.getRange((bothRow + 1) + ':' + (bothRow + 1)).setValues(rangeToCopy);
    
  

如果您添加新行,请不要忘记将 lastRow 加 1,这样您的循环仍会到达工作表的末尾。

参考资料:

Class Range | Apps Script - Method getValues()

相关问题:

Using Google Sheets scripts, why does my if statement always return false when comparing cell values?

【讨论】:

这对我有用,您能否建议将数据复制到符合条件的行的最后一行? 为什么ss.insertRowsAfter(bothRow, 1) 不适合?此外,如果您只插入一行,那么 ss.insertRowAfter(bothRow) 应该就足够了。 您确实需要在插入时将 1 添加到 lastRow,否则您的循环将不会到达工作表的末尾。 但是我想把符合条件的行的数据复制粘贴到新的行中。 我已经更新了我的答案以包括这个,很高兴能够提供帮助!

以上是关于搜索一个值,如果存在一个值,添加一行并在谷歌电子表格中复制数据的主要内容,如果未能解决你的问题,请参考以下文章

在谷歌地图上绘制区域

在谷歌地图结果中添加“搜索区域”轮廓

使用当前位置将折线绘制到目的地,并在谷歌地图上添加标记,标记颤动

如何在谷歌电子表格图中编辑图例标签?

合并重复行并设置值

在谷歌地图中点击标记添加信息窗口