javascript - 为什么我的 for 循环运行额外的迭代而不复制到正确的单元格

标签 javascript google-apps-script

当我运行我的(困惑的)脚本时,它似乎比所需的时间多运行了一次。即在最后一行下方创建一个 pdf 并将单元格标记为已处理。

第二个问题是 URL 似乎与应有的名称没有正确对齐。

我很欣赏代码非常困惑,但如果任何部分没有意义,我很乐意解释其原因。

预先感谢您的帮助!

电子表格可以在这里找到:

https://docs.google.com/spreadsheets/d/1nq5RRcwAKk9sFm6jVypFT_qJWcOGxFDZRv6ZpB-QClw/edit#gid=1194576382

未按预期工作的代码是:

var ss = SpreadsheetApp.getActiveSpreadsheet()
var rawData = "rawData"
var practicePivot = "practicePivot"
var querySheet = "querySheet"
var pdfSheet = "pdfSheet"
var contactList = "contactList"

function createPDF(){

var sourceSheet = ss.getSheetByName("querySheet")
var pdfList = ss.getSheetByName("practicePivot")
var contactList = ss.getSheetByName("contactList")
var sourceRow = sourceSheet.getLastRow()
var sourceColumn = sourceSheet.getLastColumn()
var sourceStartRow = 4 //skips the headers and only pulls query data
var sourceStartColumn = 1
var sourceRange = sourceSheet.getRange(sourceStartRow, sourceStartColumn, sourceRow, sourceColumn)
var sourceValues = sourceRange.getValues()
var pdfLastRow = pdfList.getLastRow()
var storePracticeName = sourceSheet.getRange("A2").getValues()


var newSpreadsheet = SpreadsheetApp.create("Summary of Patients for" +storePracticeName)

sourceSheet.copyTo(newSpreadsheet, {contentsOnly: true})
newSpreadsheet.getSheetByName("sheet1").activate()
newSpreadsheet.deleteActiveSheet()


var pdfURLtemp = DriveApp.getFileById(newSpreadsheet.getId()).getAs("application/pdf")
var pdf = DriveApp.createFile(pdfURLtemp)
var pdfURL = pdf.getUrl()
Logger.log(pdfURL)
return pdfURL


}


function createQuery() 
{

//Duplication check
var pdfCreated = "pdfCreated";
var pdfEmailed = "pdfEmailed";

var sheet = ss.getSheetByName("practicePivot");
var startRow = 2; 
var lastRow = sheet.getLastRow();
var lastColumn = sheet.getLastColumn();

var dataRange = sheet.getRange(startRow, 1, lastRow, lastColumn)  ;
var data = dataRange.getValues();


for (var i = 0; i < data.length; ++i)
  {

    var row = data[i];
    var practiceName = row[0]
    var pdfCheck = row[2]

    var copySelection = sheet.getRange(startRow + i, 1)
    var copyData = copySelection.getValues()
    var copyLocation = ss.getSheetByName("querySheet")
    var copyCell = copyLocation.getRange("A2")

    if (pdfCheck != pdfCreated)
      {
      var pdfURL = createPDF()
      copyCell.copyTo(copyData)
      sheet.getRange(startRow + i, 4).setValue(pdfURL)
      sheet.getRange(startRow + i, 3).setValue(pdfCreated)
            SpreadsheetApp.flush()

      }

  }
}

最佳答案

您的起始行是 2:

var startRow = 2;

您的循环将一直循环到最后一行的计数。因此,如果有 10 行,并且数据从第 2 行开始,则需要循环运行 9 次。但你的循环运行了 10 次。

因此您需要调整循环的停止位置。

var L = data.length - 1;//The number of rows in the data - not the sheet
for (var i = 0; i < L; ++i)

关于javascript - 为什么我的 for 循环运行额外的迭代而不复制到正确的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44827119/

相关文章:

google-apps-script - 提交 Google 表单后执行的脚本

javascript - VBA 到 Java 在 Google 电子表格中转换为 Doubleklick

javascript - Vue.js 2 - v-for 列表转发器中的计算属性

javascript - CKeditor 删除图像对齐属性

javascript - 合并其 parent 具有可变键名的js对象

javascript - 从 Web 应用程序传递变量并显示对话框

google-apps-script - 来自另一台服务器的 HTML 和 JavaScript?

image - 在谷歌电子表格中使图像可点击

javascript - 如果检查 javascript,则允许零 (0)

javascript - 将 javascript 值添加到 Freemarker 列表