繁体   English   中英

替换 Google Script Apps 中的单元格值

[英]Replace cell value in Google Script Apps

我正在尝试编写一个脚本,当工作表中的单元格更改"Негатив отсутствует"时,将用值"Нерелевант" " 替换另一个工作表中单元格的值。 请帮忙,我做错了什么?

function ChangeTone(event) { 
  if (event.source.getActiveRange().getValue()=="Негатив отсутствует" && event.source.getActiveSheet()=="Разметка ТОП100 по суду"){
    var sheet = SpreadsheetApp.getActiveSheet();
    var currRow = sheet.getActiveCell().getRow();
    var value = sheet.getRange(currRow, 1).getDisplayValue();
    var pasteSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Тональность");
    var data = pasteSheet.getDataRange().getValues();
//    if(currRow > 2){
//      sheet.deleteRow(currRow);
//    }
    for(var i = 1; i<data.length;i++){
          if(data[i][1] == value){
            pasteSheet.getRange((i), 2).clear({contentsOnly: true});
            pasteSheet.getRange((i), 2).setValue('Нерелевант');
            break;
          }
  };
//    sheet.getActiveCell().setValue("");
    
    
}
}

说明/问题:

问题:

您的代码有一个明显的问题,尤其是在这里:

event.source.getActiveSheet()=="Разметка ТОП100 по суду"

您正在将工作表 object与字符串进行比较,这将始终返回false 正确的做法是:

event.source.getActiveSheet().getName()=="Разметка ТОП100 по суду"

但在这里我也尝试优化你的代码,因为它效率很低。

优化:

您没有充分利用事件 object

  • SpreadsheetApp.getActiveSpreadsheet()可以替换为e.source

当您只需要执行一次时,您还可以多次定义相同的变量:

  • 对于event.source.getActiveSheet()var sheet = SpreadsheetApp.getActiveSheet(); 您可以定义一个变量来存储活动工作表 object 并在需要时调用它。

最后但并非最不重要的。 我不太确定你关于for循环的逻辑,因为你没有在你的问题中提到它。

但是我看到,只要源值与粘贴表中的值匹配,您就会使用for循环、 if语句和break来转义for循环。

  • 您可以使用findIndex来查找与标准data[i][1] == value匹配的值,而不是使用for循环。

  • 此外,如果您打算只使用一列,则不需要完整的getDataRange() ,因此我也更改了该部分。

解决方案:

function onEdit(e){
 const ss = e.source;
 const ar = e.range;
 const activeSheet = ss.getActiveSheet();
 const pasteSheet = ss.getSheetByName("Тональность");
  if (ar.getValue()=="Негатив отсутствует" && activeSheet.getName()=="Разметка ТОП100 по суду"){
    const value = activeSheet.getRange(ar.getRow(), 1).getValue();
    const data = pasteSheet.getRange('B1:B'+pasteSheet.getLastRow()).getValues().flat();
    const indx = data.findIndex((element) => element == value);
    if (indx>-1){
      const pasteRng = pasteSheet.getRange(indx+1,2);
      pasteRng.clearContent();
      pasteRng.setValue('Нерелевант');   
  }
  }
}

让我知道这是否对您有用,否则我想对其进行修改。

非常感谢。 该脚本有效=)我之前也制作了一个工作脚本,但这是我的第一个脚本。 所以它要慢得多,而且不那么……简洁,而且它是用触发器触发的。 而你的作为一个简单的事件工作:我的旧版本:

function ChangeTone(event) { 
  if (event.source.getActiveRange().getValue()=="Негатив отсутствует" && event.source.getActiveSheet().getName() == "Разметка ТОП100 СУД"){
    var sheet = SpreadsheetApp.getActiveSheet();
    var currRow = sheet.getActiveCell().getRow();
    sheet.getRange("A"+currRow+":F"+currRow).setBackground('#ff5a5a');
    var value = sheet.getRange(currRow, 1).getDisplayValue();
    var pasteSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Тональность");
    var data = pasteSheet.getDataRange().getValues();
    for(var i = 1; i<data.length;i++){
          if(data[i][0] == value){
           pasteSheet.getRange((i+1), 2).setValue('Нерелевант');
           sheet.getRange("C"+currRow+":F"+currRow).deleteCells(SpreadsheetApp.Dimension.ROWS);
          }          
  };
    sheet.getRange("A"+currRow+":B"+currRow).setBackground('#ffffff'); 
}
}

因此,在替换单元格值后使用您的代码并添加行删除。 最终版本:

function onEdit(e){
 const ss = e.source;
 const ar = e.range;
 const arRow = ar.getRow();
 const activeSheet = ss.getActiveSheet();
 const pasteSheet = ss.getSheetByName("Тональность");
  if (ar.getValue()=="Негатив отсутствует" && activeSheet.getName()=="Разметка ТОП100 СУД"){
    const value = activeSheet.getRange(arRow, 1).getValue();
    const data = pasteSheet.getRange('A1:A'+pasteSheet.getLastRow()).getValues().flat();
    const indx = data.findIndex((element) => element == value);
    if (indx>-1){
      const pasteRng = pasteSheet.getRange(indx+1,2);
      pasteRng.clearContent();
      pasteRng.setValue('Нерелевант');
      activeSheet.getRange("C"+arRow+":F"+arRow).deleteCells(SpreadsheetApp.Dimension.ROWS);
  }
  }
}

再次感谢您的帮助 =)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM