金山在线文档写入大数组出现假死问题

let testfile=KSDrive.openFile("https://www.kdocs.cn/l/********")
let backendLogSheet = Application.Sheets("后台记录")
let useHistorySheet = Application.Sheets("查询记录")
let testSheet = testfile.Application.Sheets("测试")
let backendLogSheetTable = backendLogSheet.Range("A1:AA" + backendLogSheet.UsedRange.RowEnd).Value
let useHistorySheetTable = useHistorySheet.Range("A1:F" + useHistorySheet.UsedRange.RowEnd).Value
let searchFlag = 1
testSheet.Range("A1:AA" + testSheet.UsedRange.RowEnd).ClearContents()
for (let i = 2; i < backendLogSheetTable.length; i++) {  //for循环遍历操作U列和V列数据
  searchFlag = 1
  console.log(i)
  for (let j = useHistorySheetTable.length - 1; j > 0; j--) { //数据操作代码块
    if (backendLogSheetTable[i][1] == useHistorySheetTable[j][2]) {
      backendLogSheetTable[i][20] = useHistorySheetTable[j][5]
      backendLogSheetTable[i][21] = useHistorySheetTable[j][4]
      searchFlag = 0
      break
    }
  }
  // testSheet.Range("A"+(i+1)+":AA"+(i+1)).Value=backendLogSheetTable[i]  
}
console.log("1")
testSheet.Range("A1:AA"+backendLogSheetTable.length).Value=backendLogSheetTable //程序运行到这里就会卡死,testSheet表格没有写入数据,日志窗口长时间没有变化
file.close

工作表“后台记录”中的数据量是4000*26个单元格,首先以二维数组的形式读取到backendLogSheetTable中。然后使用for循环遍历操作U列和V列数据,即backendLogSheetTable[i][20]和backendLogSheetTable[i][21],得到新的二维数组之后写入测试表格testSheet中(第23行)。但是程序运行到第22行日志输出”1“之后就出现假死问题,testSheet表格没有写入数据,日志窗口长时间没有变化。

但是如果改变写入方式,在操作数据的for循环遍历的时候就每次写入一行(如下代码第20行)就没有出现假死的问题,数据也能成功写入。第23行语句只要不加注释,程序就会在此处卡死。

let testfile=KSDrive.openFile("https://www.kdocs.cn/l/********")
let backendLogSheet = Application.Sheets("后台记录")
let useHistorySheet = Application.Sheets("查询记录")
let testSheet = testfile.Application.Sheets("测试")
let backendLogSheetTable = backendLogSheet.Range("A1:AA" + backendLogSheet.UsedRange.RowEnd).Value
let useHistorySheetTable = useHistorySheet.Range("A1:F" + useHistorySheet.UsedRange.RowEnd).Value
let searchFlag = 1
testSheet.Range("A1:AA" + testSheet.UsedRange.RowEnd).ClearContents()
for (let i = 2; i < backendLogSheetTable.length; i++) {  //for循环遍历操作U列和V列数据
  searchFlag = 1
  console.log(i)
  for (let j = useHistorySheetTable.length - 1; j > 0; j--) {  //数据操作代码块
    if (backendLogSheetTable[i][1] == useHistorySheetTable[j][2]) {
      backendLogSheetTable[i][20] = useHistorySheetTable[j][5]
      backendLogSheetTable[i][21] = useHistorySheetTable[j][4]
      searchFlag = 0
      break
    }
  }
  testSheet.Range("A"+(i+1)+":AA"+(i+1)).Value=backendLogSheetTable[i]  //在操作数据时每次写入一行就没有问题
}
console.log("1")
//testSheet.Range("A1:AA"+backendLogSheetTable.length).Value=backendLogSheetTable  //只要把注释去掉,就会卡死在这里
file.close

我猜测可能是数据量太大,服务器拒绝一次性写入所以尝试过其他方式,将上面23行一次性写入的代码改成for循环遍历每一行写入(如下代码23-25行),一样也出现假死的状态。

let testfile=KSDrive.openFile("https://www.kdocs.cn/l/********")
let backendLogSheet = Application.Sheets("后台记录")
let useHistorySheet = Application.Sheets("查询记录")
let testSheet = testfile.Application.Sheets("测试")
let backendLogSheetTable = backendLogSheet.Range("A1:AA" + backendLogSheet.UsedRange.RowEnd).Value
let useHistorySheetTable = useHistorySheet.Range("A1:F" + useHistorySheet.UsedRange.RowEnd).Value
let searchFlag = 1
testSheet.Range("A1:AA" + testSheet.UsedRange.RowEnd).ClearContents()
for (let i = 2; i < backendLogSheetTable.length; i++) {  //for循环遍历操作U列和V列数据
  searchFlag = 1
  console.log(i)
  for (let j = useHistorySheetTable.length - 1; j > 0; j--) {  //数据操作代码块
    if (backendLogSheetTable[i][1] == useHistorySheetTable[j][2]) {
      backendLogSheetTable[i][20] = useHistorySheetTable[j][5]
      backendLogSheetTable[i][21] = useHistorySheetTable[j][4]
      searchFlag = 0
      break
    }
  }
  //testSheet.Range("A"+(i+1)+":AA"+(i+1)).Value=backendLogSheetTable[i]
}
console.log("1")
for(let i=0;i<backendLogSheetTable.length;i++){  //用for循环每次写入一行也会卡死,没有任何数据写入
  testSheet.Range("A"+(i+1)+":AA"+(i+1)).Value=backendLogSheetTable[i]
}

请教各位大神,这是什么问题嗷?

四川省
浏览 450
收藏
3
分享
3 +1
2
+1
全部评论 2
 
徐飞帆
徐飞帆

@金山办公

感谢您的反馈,问题重现,具体原因目前还在定位中。 您可以先新建一个2.0脚本将代码复制进去解决您反馈的问题,由于1.0 2.0的api不完全一致,这段代码在2.0使用需要做一些调整: 1. RowEnd在2.0和js宏无此方法,需要用Row+Rows.Count -1 替代 2. Value在 2.0和js宏中是只读的方法,需要用Value2替代 例如: backendLogSheet.Range("A1:AA" + backendLogSheet.UsedRange.RowEnd).Value 改为: const backendLogSheetRowEnd = backendLogSheet.UsedRange.Row + backendLogSheet.UsedRange.Rows.Count - 1; backendLogSheet.Range("A1:AA" + backendLogSheetRowEnd ).Value2 代码中其它用到的地方也做同样的修改即可在2.0正常运行。 另外代码最后的file.close是无效的,按照代码逻辑应该是testfile.close()
· 广东省
回复
王壮
好的,感谢
· 四川省
回复