如果字符串在两个工作表上匹配,则使用值更新工作表

时间:2015-10-11 18:54:17

标签: javascript google-apps-script google-sheets

工作表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);
    }
  }

1 个答案:

答案 0 :(得分:2)

电子表格公式

您可以让一张表中的行跟随另一张表中的行而不使用脚本。例如,假设我们有一张名为Items的工作表,其中包含每个项目的一行,第一列中的项目编号。

source data

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

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

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

screenshot

脚本

您的脚本存在一些问题。

  • .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);
}