如何将OnEdit脚本转换为按钮运行脚本(使用规则将单元格从1张复制到另一张)

时间:2017-12-18 14:08:02

标签: google-apps-script google-sheets

我已经制作了一个运行良好的脚本来复制单元格* OnEdit(表2中的col16),如果 Col16 =“是”中的任何行)到表格 1 (现为Col4)。但我在表 2 上有一个基于查询的数据,所以我的脚本只有在我手工输入“是”时才会复制数据。这就是为什么现在我需要按钮运行这个脚本,或者作为时间驱动的触发器。按钮不能让它工作。如何更改以下脚本以使其可以通过单击按钮来工作?

function onEdit(e) {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
 if (sheet.getName() !== '2' || e.range.getColumn() !== 16 || e.value !== 'Yes') return;
  var value = e.range.offset(0,-12,1,1).getValue();
  sheet = e.source.getSheetByName('1');
  var grd = sheet.getRange("D:D").getValues();
  var maxIndex = grd.reduce(function(maxIndex, row, index) {
  return row[0] === "" ? maxIndex : index;
  }, 0);
  sheet.getRange(maxIndex+2,e.range.getColumn()-12,1,1).setValue(value);
}

更新:我试图像这样更改我的脚本,将其分配给按钮,点击按钮后 - 它会说“正在运行.....然后完成...”但是它不会复制任何东西(但是当它是OnEdit(e)时它可以工作,而且我没有收到任何错误。 但似乎仅仅将“OnEdit(e)”更改为“copymissings()”是不够的,我需要在代码中更改某些内容,但我不知道到底是什么。请帮忙:

function copymissings() {
  var s = SpreadsheetApp.getActive();
  if (s.getName() !== '2' || range.getColumn() !== 16 || value !== 'Yes') return;
  var value = range.offset(0,-12,1,1).getValues();
  sht = s.getSheetByName('1');
  var grd = sheet.getRange("D:D").getValues();
  var maxIndex = grd.reduce(function(maxIndex, row, index) {
  return row[0] === "" ? maxIndex : index;
  }, 0);
  sht.getRange(maxIndex+2,range.getColumn()-12,1,1).setValues(value);
}

可视化: CLICK TO SEE GIF

2 个答案:

答案 0 :(得分:0)

我认为你在这里混合了两个概念。 onEdit()是一个触发器,当用户更改单元格的值时,它会自动运行。然而,您要做的是MANUAL,因为当事件触发时用户负责。

有关创建UI按钮的方法,请参阅HTML Service: Create and Serve HTML。您可以查看实际样本here

答案 1 :(得分:0)

非常感谢Edward Ulle来自" Plus"谷歌应用程序脚本论坛。

我们制作了与我在帖子中提供的相同脚本的工作版本,该脚本自动运行OnEdit。

如果该行包含"是"以下脚本从Sheet-2 Col4复制单元格。在col16到Sheet-1 col4。一切都是可选的。

function copymissings() {
  try {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    // Source sheet
    var shs = ss.getSheetByName("2");
    //  Values from Sheet2
    var vs = shs.getRange(1,1,shs.getLastRow(),shs.getLastColumn()).getValues();
    // Destination sheet
    var shd = ss.getSheetByName("1");
    // Get the destination range
    var rd = shd.getRange("D:D");
    // Gets a 2D array
    var vd = rd.getValues();
    var j = 1;
    // Get offset j to first empty row
    for( j=0; j<vd.length; j++ ) {
      if( vd[j][0] == 0 ) break;
    }
    //  Assuming you want to do for every row in Sheet2
    for( var i=0; i<vs.length; i++ ) {
      if( vs[i][15] == "Yes" ) {  // Column 16 is index 15
        // Use offset from last row of destination sheet
        rd.offset(j,0,1,1).setValue(vs[i][3]);  // Copy to column 4 (0)
        j++; // Increment to next row
      }
    }
  }
  catch(err) {
    Logger.log(err);
  }
}