为了账号安全,请及时绑定邮箱和手机立即绑定

替换 Google 脚本应用中的单元格值

替换 Google 脚本应用中的单元格值

宝慕林4294392 2024-01-18 14:59:10
我正在尝试编写一个脚本,当工作表中的单元格发生更改时"Негатив отсутствует",它将用值替换另一个工作表中的单元格的值"Нерелевант"。请帮忙,我做错了什么?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("");        }}
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

说明/问题:

问题:

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

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

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

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

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

优化:

您没有充分利用事件对象。

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

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

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

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

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

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

  • 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('Нерелевант');   

  }

  }

}

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


查看完整回答
反对 回复 2024-01-18
?
HUWWW

TA贡献1874条经验 获得超12个赞

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


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

  }

  }

}

再次感谢您的帮助=)


查看完整回答
反对 回复 2024-01-18
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信