【问题标题】:Move row to different sheet using Google Apps Script使用 Google Apps 脚本将行移动到不同的工作表
【发布时间】:2022-01-24 14:36:33
【问题描述】:

我和我的老师们喜欢给学生们发送一些谷歌小图,让他们知道他们最近做得很好。我们有一个我们使用的电子表格,我正在尝试在他们的绘图准备好查看时自动化向他们发送电子邮件的过程。我上周开始学习编码和谷歌脚本,所以我缺乏排除故障的技能,而我已经完成了谷歌搜索,这会出现运行onEdit 的脚本,而我想手动运行脚本。基本上我正在尝试编写一个脚本,当我触发它时:

  1. 使用电子表格中的信息发送电子邮件
  2. 将该行信息从“未发送”表移动到“已发送”表
  3. 从“已发送”表中删除该行

到目前为止,我已经能够完成第 1 步和第 3 步,但我可以在第 2 步中使用一些帮助。我正在尝试使用 moveRows(),但我不确定如何从我已经尝试过的内容开始。这是我目前所拥有的:

  sendPositiveRecognitionEmails();
  deleteCheckedBoxes();
  } 
 function sendPositiveRecognitionEmails() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent')
  var lastRow = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getLastRow()
  var studentFirstNameRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getRange("A2:A" + lastRow);
  var studentFirstname = studentFirstNameRange.getValues();
  var studentEmailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getRange("C2:D" + lastRow);
  var studentEmail = studentEmailRange.getValues();
  var parentEmailRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getRange("D2:D" + lastRow);
  var parentEmail = parentEmailRange.getValues();
  var emailSendRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getRange("L2:L" + lastRow);
  var emailSend = emailSendRange.getValues();
  var linkRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getRange("E2:E" + lastRow);
  var link = linkRange.getValues()
  for (var i = 0; i < studentFirstname.length; i++) {
    if (emailSend[i][0]) {
      // Send Alert Email.
      var message = "Hi " + studentFirstname[i][0] + "! <br><br>You have been doing a great job this year, so we made this for you! Keep up the great work! <br><br>"+ link[i][0] +"<br><br><br>The Supernova Teachers"; // Second column
      var subject = 'Positive Recognition'; 
      MailApp.sendEmail({
    to: studentEmail[i][0] + "," + parentEmail[i][0],
    subject: "Positive Recognition",
    htmlBody: message,
      })
    }  
  } 
}
function deleteCheckedBoxes() {;

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent')
 var lastRow = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getLastRow()
const colLData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Unsent').getRange("L2:L" + lastRow).getValues();
for(let i = colLData.length-1; i >= 0;i--){
  if(colLData[i][0] === true){
    sheet.moveRows(i+2,SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sent'))
    sheet.deleteRows(i+2)
  }
}
};```

Here is the spreadsheet: [Sheet][1]


  [1]: https://docs.google.com/spreadsheets/d/1dFlOg6rQeKARtZmMfyNGgMX8Chtz2XXNosFKxRcEryQ/edit?usp=sharing

【问题讨论】:

  • 关于Basically I am trying to write a script that when I trigger it will:,在您的情况下,您希望何时运行脚本?例如,将多个值输入到单元格中,并且您想在脚本中使用所有输入的值,我无法理解您何时要运行脚本。对此我深表歉意。
  • 我想手动触发脚本运行,我已将其保存为工作表上的宏。抱歉不清楚!
  • 感谢您的回复。我不得不为我糟糕的英语水平道歉。不幸的是,我无法理解I want to manually trigger the script to run。你能提供你的目标的细节吗?通过这个,我想试着理解你的问题。

标签: google-apps-script google-sheets


【解决方案1】:

我认为您的问题是 moveRows() 的 destinationIndex 参数只能是整数。我所知道的在工作表之间“移动”行的最佳方法是将数据从未发送页面上的行复制到已发送页面上的一行,然后删除旧行。

试试这个:

function deleteCheckedBoxes() {
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const sent = ss.getSheetByName('Sent');
      const unsent = ss.getSheetByName('Unsent');

      const lastRow = unsent.getLastRow()
      const colLData = unsent.getRange("L2:L" + lastRow).getValues();
      for (let i = colLData.length - 1; i >= 0; i--) {
        if (colLData[i][0] === true) {
          // Get Row Value
          let rowToMove = unsent.getRange(i + 2, 1, 1, unsent.getLastColumn()).getValues();
          // Set Row Value
          let sendToRow = sent.getRange(sent.getLastRow() + 1, 1, 1, rowToMove[0].length);
          // Send/Delete Row Data
          sendToRow.setValues(rowToMove)
          unsent.deleteRows(i + 2)
        }
      }
    };

如果您仍有问题,请告诉我,欢迎编码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多