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

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


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

    

    

}

}


宝慕林4294392
浏览 79回答 2
2回答

慕田峪7331174

说明/问题:问题:您的代码有一个明显的问题,特别是在这里: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一行来转义循环。forfor您可以使用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('Нерелевант');     }  }}让我知道这是否对您有用,否则我想对其进行修改。

HUWWW

非常感谢!该脚本有效=)我之前也制作过一个有效脚本。但这是我的第一个脚本,所以它要慢得多,而且不那么……简洁。它也是用触发器触发的,而你的则作为一个简单的事件工作。我的旧版本:function ChangeTone(event) {&nbsp;&nbsp; if (event.source.getActiveRange().getValue()=="Негатив отсутствует" && event.source.getActiveSheet().getName() == "Разметка ТОП100 СУД"){&nbsp; &nbsp; var sheet = SpreadsheetApp.getActiveSheet();&nbsp; &nbsp; var currRow = sheet.getActiveCell().getRow();&nbsp; &nbsp; sheet.getRange("A"+currRow+":F"+currRow).setBackground('#ff5a5a');&nbsp; &nbsp; var value = sheet.getRange(currRow, 1).getDisplayValue();&nbsp; &nbsp; var pasteSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Тональность");&nbsp; &nbsp; var data = pasteSheet.getDataRange().getValues();&nbsp; &nbsp; for(var i = 1; i<data.length;i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(data[i][0] == value){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pasteSheet.getRange((i+1), 2).setValue('Нерелевант');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sheet.getRange("C"+currRow+":F"+currRow).deleteCells(SpreadsheetApp.Dimension.ROWS);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; };&nbsp; &nbsp; sheet.getRange("A"+currRow+":B"+currRow).setBackground('#ffffff');&nbsp;}}因此,在替换单元格值后,使用您的代码并添加行删除。最终版本:function onEdit(e){&nbsp;const ss = e.source;&nbsp;const ar = e.range;&nbsp;const arRow = ar.getRow();&nbsp;const activeSheet = ss.getActiveSheet();&nbsp;const pasteSheet = ss.getSheetByName("Тональность");&nbsp; if (ar.getValue()=="Негатив отсутствует" && activeSheet.getName()=="Разметка ТОП100 СУД"){&nbsp; &nbsp; const value = activeSheet.getRange(arRow, 1).getValue();&nbsp; &nbsp; const data = pasteSheet.getRange('A1:A'+pasteSheet.getLastRow()).getValues().flat();&nbsp; &nbsp; const indx = data.findIndex((element) => element == value);&nbsp; &nbsp; if (indx>-1){&nbsp; &nbsp; &nbsp; const pasteRng = pasteSheet.getRange(indx+1,2);&nbsp; &nbsp; &nbsp; pasteRng.clearContent();&nbsp; &nbsp; &nbsp; pasteRng.setValue('Нерелевант');&nbsp; &nbsp; &nbsp; activeSheet.getRange("C"+arRow+":F"+arRow).deleteCells(SpreadsheetApp.Dimension.ROWS);&nbsp; }&nbsp; }}再次感谢您的帮助=)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript