javascript - 使用 GAS 在 Google 工作表选项卡之间附加数据

标签 javascript google-apps-script google-sheets

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

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),不存在循环。它们是在顶部定义的,以适应 future 的任何更改,例如 MOVED_TO_SENDER

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

找到新行后,将其添加到 results 数组中,并将当前行附加值更新为"is"。将所有新行放入 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);
}

关于javascript - 使用 GAS 在 Google 工作表选项卡之间附加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55706370/

相关文章:

javascript - jQuery 可调整大小 : How to get overlapping element during the resize drag

javascript - 将时间戳添加到 Google Spreadsheet onEdit 脚本中的命名列

javascript - 在 Google Scripts 中将 JS 变量传递给 HTML

javascript - 为什么 Next.js 自定义服务器禁用自动静态优化?

javascript - 回调函数自动滚动失败

javascript - 寻找取消时将表单值恢复为原始值的最有效方法

javascript - 使用 Google Sheets API 将图像插入 Google Sheets 单元格

javascript - 谷歌日历脚本 : remove recurrence

javascript - 尝试通过 API 添加到 Google 表格的超链接

c# - 如何使用 C# 和 Sheet Api 访问和插入数据到 Google Spread Sheet?