工作表2包含所有项目及其状态,而工作表1仅包含工作表2中的某些项目。我希望能够每次看到工作表1上提到的项目具有状态更新(即日期,在工作表2。

这是我到目前为止的内容,但是在调用合适的范围时遇到了麻烦。有没有更简单的方法可以做我想做的事?

  function statusupdate() {
    var activesht = SpreadsheetApp.getActiveSpreadsheet();
    var statussht = activesht.getSheetByName("Sheet 2"); //get sheet on which status update occurs
    var statusrng1 = statussht.getRangeByName('B');
    var statusrng2 = statussht.getRangeByName('C');
    var mainsht = activesht.getSheetByName("Sheet 1"); //get sheet where you show a specific thing has been updated, if that thing mentioned here.
    var mainrng = mainsht.getRangeByName('F');

    if (statusrng1 == mainrng) {
      var date = statusrng2.getValue();
      var daterng = mainrng.getRangeByName('E');

      daterng.setValues(date);
    }
  }

最佳答案

电子表格公式

您可以不使用脚本而使一张纸中的行紧随另一张纸中的行。例如,假设我们有一个名为Items的工作表,其中每行我们携带的物品都包含一行,而物品编号在第一列中。

javascript - 如果字符串在两张纸上匹配,则用值更新一张纸-LMLPHP

我们可以使用VLOOKUP()搜索包含有关单个项目信息的行,并从中选择特定的列。

例如,此公式将在B2中使用,并且可以复制到工作表中的其他单元格中:

=VLOOKUP($A2,Items!$A$2:$C$7,COLUMN(),false)


javascript - 如果字符串在两张纸上匹配,则用值更新一张纸-LMLPHP

脚本

您的脚本存在一些问题。


.getRangeByName('B')-此方法获取命名范围。给定名称,我怀疑您的意思是获取列B,而不是命名范围。如果是这样,您可以改用以下方法:

var statusrng1 = statussht.getRange('B:B');


在A1Notation中,范围B:B是整个列B。
您打算复制值,因此除了确定范围外还需要执行另一步;您需要先从某个范围读取值,然后再将它们写入其他范围。为此,您需要使用getValues()setValues().之类的方法


这是脚本的更新版本,适用于上述示例电子表格。

function statusupdate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  //get sheet on which status update occurs
  var statusSheet = ss.getSheetByName("Items");
  var statusRange = statusSheet.getDataRange();
  var statusData = statusRange.getValues();

  //get sheet where you show a specific thing has been updated, if that thing mentioned here.
  var trackingSheet = ss.getSheetByName("Tracking");
  var trackingRange = trackingSheet.getDataRange();
  var trackingData = trackingRange.getValues();

  // Loop over all rows in the Tracking sheet to update from the Items sheet
  // Start with row=1, because row 0 contains headers
  for (var row=1; row<trackingData.length; row++) {
    var item = trackingData[row][0];
    if (item == '') continue;  // skip rows without item #

    // Look for item in Items sheet
    var statusRow = null;
    for (var sRow=1; sRow<statusData.length; sRow++) {
      if (statusData[sRow][0] == item) {
        // Found our match, grab that row
        statusRow = statusData[sRow];
        break;
      }
    }

    // If we found a matching row, copy the status
    if (statusRow) {
      // Customize this depending on how your sheets are organized
      trackingData[row][1] = statusRow[1];
      trackingData[row][2] = statusRow[2];
    }
  }

  // All values have been copied to trackingData, now write to sheet
  trackingRange.setValues(trackingData);
}

10-07 14:45