使用 GAS 在 Google 工作表标签之间追加数据



我想将一些数据从Google表格中的一个标签附加到另一个标签。附加数据后,我想更新一个名为"已追加"的列并将其设置为"是"。然后,我的代码应该跳过已经附加的任何行,但是我是初学者,所以这对我来说有点新。

function dumpSMSintoSender() {
    var MOVED_TO_SENDER = "Yes";
    var userSheet = SpreadsheetApp.getActiveSpreadsheet();
    var userTab = userSheet.getSheetByName('SmartCare');
    var SenderTab = userSheet.getSheetByName('Sheet1');
    var numRows = 200
    var firstRow = 2;
    var range = userTab.getRange(firstRow, 3, userTab.getLastRow() - firstRow +1, 3);
    var data = range.getValues();
    var dataRange = userTab.getRange(firstRow, 3, numRows, 10)
    // Fetch values for each row in the Range.
    var Movedata = dataRange.getValues();
    for (var i = 0; i < Movedata.length; ++i) {
        var row = Movedata[i];
        var MovedtoSender = row[5];
        var sender = row[0];
        var mobile = row[1];
        var message = row[2];
        if (mobile != "") {
            if (MovedtoSender != MOVED_TO_SENDER) {  // Prevents sending duplicates
                SenderTab.getRange(SenderTab.getLastRow() + 1, 1, data.length,3).setValues(data);
                userTab.getRange(firstRow + i, 8).setValue("Yes");
                // Make sure the cell is updated right away in case the script is interrupted
                SpreadsheetApp.flush();
            }
        }
    }
}

实际发生的是,对于代码的每个循环,它都会附加工作表中的所有内容。因此,如果要追加 5 条记录,则新选项卡中将出现 25 条新记录,因为每个记录已追加 5 次(每次迭代一次(。是否可以将代码更改为仅附加"追加"列为空的行?

我试图保持简单和要检查的两个项目 - 移动(MOBILE_COL(和移动到发件人(MOVED_TO_SENDER_COL(,脱离循环。它们被定义在顶部以适应任何未来的变化,例如MOVED_TO_SENDER

然后userTab整个工作表范围和值。并逐行比较上面代码中显示的值,以查找以前未附加的新行。

找到新行后,将其添加到数组results并将当前行追加值更新为"是"。将所有新行放入数组results后,我们将它们写入 senderTab .并使用更新userValues更新userTab.

这里的诀窍是累积所有新行并一次性将它们写在一起。它比逐行写入更快。更新userTab时应用的方法相同。我们更新内存中的userValues,最后一次性写入整个数组userTab

function dumpSMSintoSender() {
  // value to check for
  var MOVED_TO_SENDER = 'Yes';
  // which column is mobile, which is first item to test
  var MOBILE_COL = 4; // A = 1, B = 2 etc
  // which column is move to sender = appended, which is second item to test
  var MOVED_TO_SENDER_COL = 8; // A = 1, B = 2 etc
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var userTab = ss.getSheetByName('SmartCare');
  var senderTab = ss.getSheetByName('Sheet1');
  // getting userTab full sheet range and values
  var userRange = userTab.getDataRange();
  var userValues = userRange.getValues();
  // array to keep new append-able rows
  var results = [];
  // for each row in userValues check to see if append-able
  // if yes, add to results array and update userValues array by setting appended to 'Yes'
  userValues.forEach(function(row) {
    if (row[MOBILE_COL - 1] != '') {
      if (row[MOVED_TO_SENDER_COL - 1] != MOVED_TO_SENDER) {
        results.push(row);
        row[MOVED_TO_SENDER_COL - 1] = MOVED_TO_SENDER;
      }
    }
  });
  // write new rows to senderTab
  senderTab
    .getRange(senderTab.getLastRow() + 1, 1, results.length, results[0].length)
    .setValues(results);
  // update userTab
  userRange.setValues(userValues);
}

最新更新