使用GAS在Google表格标签之间添加数据

时间:2019-04-16 10:47:29

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

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

function getMetaFromDriveApi (accessToken) {

  // the API end point
  var endPoint = "https://www.googleapis.com/auth/gmail.compose";

  // get 10 files matching some namee
  var response = UrlFetchApp.fetch (
    endPoint + "?pageSize=10&q=" + 
    encodeURIComponent(
      "name contains 'goa'" +
      " and trashed=false"
    ) + "&fields=" +
    encodeURIComponent(
      "files(id,mimeType,name),nextPageToken"
    )
    , {
    headers: {
      Authorization:'Bearer ' + accessToken
    }
  });

  // objectify the result
  return JSON.parse (response.getContentText());
}

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

1 个答案:

答案 0 :(得分:1)

我试图保持简单,并检查两个项目-移动(MOBILE_COL)并移到发件人(MOVED_TO_SENDER_COL)之外。它们的定义是为了适应将来的任何变化,例如MOVED_TO_SENDER

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

找到新行后,将其添加到results数组中,并将此当前行的附加值更新为“是”。将所有新行放入results数组后,我们将其写入senderTab。然后用更新的userTab更新userValues

这里的窍门是累积所有新行并将它们一次性写入在一起。它比逐行写入要快。更新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);
}