简体   繁体   English

Office 脚本需要更长的时间

[英]Office scripts takes longer time

When using office scripts in power automate it takes long time and after taking long time it gets failed in run scripts steps.在 power automate 中使用 office 脚本时,它需要很长时间,并且在花费很长时间后,它会在运行脚本步骤中失败。 and gives me problem as [68, 62] Invoking read methods inside of a loop could lead to slow performance of the script.给我的问题是 [68, 62] 在循环内调用读取方法可能会导致脚本性能下降。 i have to update the range.我必须更新范围。 It work but it only update last row of sheet i have to update last row of every project它有效,但它只更新工作表的最后一行我必须更新每个项目的最后一行

function main(workbook: ExcelScript.Workbook, nonGDOWorksheetName: string, gdoWorksheetName: string) {

let projectIDLength = 12

nonGDOSheet.getRange('A:A').unmerge();
let nonGDORange = nonGDOSheet.getUsedRange();
let nonGDOValues = nonGDORange.getValues();

let gdoSheet = workbook.getWorksheet('GDO Dollarized');

gdoSheet.getRange("GG:IN")
    .delete(ExcelScript.DeleteShiftDirection.left);

const gdoRange = gdoSheet.getUsedRange();
const gdoValues = gdoRange.getValues();

const blankRowsBeforeUsedRangeGDO = 2
const blankRowsBeforeUsedRangeNonGDO = 2
const startingRow = 5
const summationCellIndex = 7
const projectIndex = 0

let currentproject: string;
let previousProject: string;
   
for (let row = startingRow; row < nonGDOValues.length; row++) {
    
    currentproject = String(nonGDOValues[row][projectIndex]);
    
    if (currentproject != 'Σ' && currentproject.length == projectIDLength) {
       
        if (nonGDORange.getCell(row, summationCellIndex).getValue() == '') {
            
            previousProject = String(nonGDOValues[row - 1][projectIndex]);
           
            row =
                addGDOData(previousProject, gdoRange, gdoValues, blankRowsBeforeUsedRangeGDO, blankRowsBeforeUsedRangeNonGDO, nonGDOSheet, gdoSheet, row, false)

        }
    }
    
    nonGDORange = nonGDOSheet.getUsedRange();
    nonGDOValues = nonGDORange.getValues();
}

nonGDORange = nonGDOSheet.getUsedRange();
nonGDOValues = nonGDORange.getValues();

let lastRow = nonGDOValues.length - blankRowsBeforeUsedRangeNonGDO

let lastProject: String = String(nonGDOValues[lastRow][projectIndex]);

addGDOData(lastProject, gdoRange, gdoValues, blankRowsBeforeUsedRangeGDO, blankRowsBeforeUsedRangeNonGDO, nonGDOSheet, gdoSheet, lastRow, true)

return;}

function getGDORange(projectName: String, gdoRange: ExcelScript.Range, gdoValues: (string | number | boolean)[][]) {

let st = -1, en = 0;

for (let row = 4; row < gdoValues.length; row++) {

    let project: String = String(gdoValues[row][0]);

    if (project != 'Σ') {

        if (project == projectName) {

            if (gdoRange.getCell(row, 7).getValue() !== '') {

                if (st == -1) {
                    st = row;
                    en = st
                }
                en = row;
            }
        }
    }
}

return {
    start: st,
    end: en
} }


function addGDOData(project: String, gdoRange: ExcelScript.Range, gdoValues: (string | number | boolean)[][], blankRowsBeforeUsedRangeGDO: number, blankRowsBeforeUsedRangeNonGDO: number, nonGDOSheet: ExcelScript.Worksheet, gdoSheet: ExcelScript.Worksheet, row: number, isLastRow: boolean) {
let GDOSampleRangeObj = {
    start: 0,
    end: 0
}

GDOSampleRangeObj = getGDORange(project, gdoRange, gdoValues)

if (GDOSampleRangeObj.start == -1) {
    return row;
}

let GDOSampleRange = GDOSampleRangeObj.start + (blankRowsBeforeUsedRangeGDO) + ':' + (GDOSampleRangeObj.end + blankRowsBeforeUsedRangeGDO)

let GDORangeDifference = GDOSampleRangeObj.end - GDOSampleRangeObj.start

let nonGDOSampleRange: string;

if (!isLastRow) {
    nonGDOSampleRange = (row + blankRowsBeforeUsedRangeNonGDO) + ':' + (row + GDORangeDifference + blankRowsBeforeUsedRangeNonGDO)
} else {
    nonGDOSampleRange = (row + blankRowsBeforeUsedRangeNonGDO + 2) + ':' + (row + GDORangeDifference + blankRowsBeforeUsedRangeNonGDO + 1)
}

nonGDOSheet.getRange(nonGDOSampleRange).insert(ExcelScript.InsertShiftDirection.down);

nonGDOSheet.getRange(nonGDOSampleRange).copyFrom(gdoSheet.getRange(GDOSampleRange));

row = row + GDORangeDifference + blankRowsBeforeUsedRangeNonGDO - 1;

return row }    

i have tried as keep comment on update range inside loop我已经尝试在循环内对更新范围发表评论

The issue is with this line:问题在于这一行:

if (nonGDORange.getCell(row, summationCellIndex).getValue() == '')

The getValue() call is going back and re-reading from the Excel workbook, which requires a slower call to the workbook session. You don't need to do this; getValue() 调用返回并从 Excel 工作簿重新读取,这需要较慢地调用工作簿 session。您不需要这样做; you already have the same values in nonGDOValues (unless I misunderstood something and those values have changed since you read them at the beginning).您已经在 nonGDOValues 中具有相同的值(除非我误解了某些内容并且这些值自您开始阅读以来已经发生了变化)。 You can instead reference the value like您可以改为引用值

nonGDOValues[row][summationCellIndex]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM