Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用GAS在googlesheet选项卡之间添加数据_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 使用GAS在googlesheet选项卡之间添加数据

Javascript 使用GAS在googlesheet选项卡之间添加数据,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我想将一些数据从谷歌工作表的一个选项卡添加到另一个选项卡。一旦数据被追加,我想更新一个名为“追加”的列,并将其设置为“是”。我的代码应该跳过任何已经附加的行,但是我是一个初学者,所以这对我来说有点新鲜 function dumpSMSintoSender() { var MOVED_TO_SENDER = "Yes"; var userSheet = SpreadsheetApp.getActiveSpreadsheet(); var userTab = userShee

我想将一些数据从谷歌工作表的一个选项卡添加到另一个选项卡。一旦数据被追加,我想更新一个名为“追加”的列,并将其设置为“是”。我的代码应该跳过任何已经附加的行,但是我是一个初学者,所以这对我来说有点新鲜

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();
            }
        }
    }
}
函数dumpSMSintoSender(){
var移动到发送人=“是”;
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(第一行,3,numRows,10)
//获取范围中每行的值。
var Movedata=dataRange.getValues();
对于(变量i=0;i

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

我试图使其保持简单,并将要检查的两项-移动(
mobile\u COL
)和移动到发送方(
moved\u to\u sender\u COL
),排除在循环之外。它们被定义在顶部,以适应将来的任何更改,例如
移动到\u发送方

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

找到新行后,将其添加到
results
数组中,并将当前行的附加值更新为“Yes”。将所有新行放入
结果
数组后,我们将它们写入
发送选项卡
。并使用更新的
用户值
更新
用户选项卡

这里的诀窍是将所有新行累加起来,然后一次性将它们写在一起。它比一行一行地写要快。更新
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);
}

您好,Evision,欢迎来到StackOverflow。从你的问题中我可以得出结论,你似乎是编程新手。没关系,我们都是从某个地方开始的。在未来,请看一看。它有助于直观地组织代码,并使任何试图帮助您的人都更容易阅读。大多数可用的编程工具甚至都具有这种内置功能。请在以后发布代码时使用它。谢谢你的回答,这似乎很有效,我只需要问一下如何进行更改。目前,这会将所有列追加到新工作表中。您能告诉我如何修改此项以仅附加第2、3和4列吗?(C、D&E)例如。所有其他功能都是完美的<代码>结果。推送([第[2]行、第[3]行、第[4]行])换成这个。col C=3,不是2一切都正常,我只剩下一个问题。。。包含正在移动的数据的选项卡包含许多公式。但是,每次脚本运行时,它都会删除所有公式,只留下值。有什么我可以改变的吗?