Weeknum3

 

function main(workbook: ExcelScript.Workbook) {

  // ====== CONFIGURE THESE ======

  const tableName = "tbl_Auto";           // change to your table name

  const dateColumnName = "Planned start"; // change to the column that contains the date

  const weekColumnName = "Week";          // name of the new column to add/overwrite

  // ============================


  const table = workbook.getTable(tableName);

  if (!table) {

    console.log(`Table "${tableName}" not found.`);

    return;

  }


  // ensure date column exists

  try {

    table.getColumnByName(dateColumnName);

  } catch (e) {

    console.log(`Date column "${dateColumnName}" not found in table.`);

    return;

  }


  // Add week column if missing

  let weekColumn;

  try {

    weekColumn = table.getColumnByName(weekColumnName);

  } catch (e) {

    table.addColumn(-1, weekColumnName);

    weekColumn = table.getColumnByName(weekColumnName);

  }


  // Read date values between header and total

  const dateColumn = table.getColumnByName(dateColumnName);

  const dateValues = dateColumn.getRangeBetweenHeaderAndTotal().getValues();


  const output: string[][] = [];


  for (let i = 0; i < dateValues.length; i++) {

    const raw = dateValues[i][0];

    let d: Date | null = null;


    // 1) If value behaves like a Date object

    if (raw && typeof raw === "object" && typeof (raw as any).getTime === "function") {

      d = new Date((raw as any).getTime());

    } else {

      // 2) If it's a number (Excel serial like 45065.9339)

      const num = Number(raw);

      if (!isNaN(num)) {

        const epoch = new Date(1899, 11, 30); // Excel epoch

        const days = Math.floor(num);

        const frac = num - days;

        const ms = Math.round(frac * 24 * 60 * 60 * 1000);

        d = new Date(epoch.getTime() + days * 24 * 60 * 60 * 1000 + ms);

      } else {

        // 3) Try parsing as a string date

        const parsed = new Date(String(raw));

        if (!isNaN(parsed.getTime())) d = parsed;

      }

    }


    if (d) {

      const weekNum = getISOWeekNumber(d);

      const formatted = `W${String(weekNum).padStart(2, "0")} ${d.getFullYear()}`;

      output.push([formatted]);

    } else {

      output.push([""]);

    }

  }


  // Write results to the week column

  weekColumn.getRangeBetweenHeaderAndTotal().setValues(output);

}


/**

 * Compute ISO week number (1-53)

 */

function getISOWeekNumber(date: Date): number {

  const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));

  const dayNum = d.getUTCDay() || 7; // Monday=1 .. Sunday=7

  d.setUTCDate(d.getUTCDate() + 4 - dayNum);

  const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));

  return Math.ceil((((d.getTime() - yearStart.getTime()) / 86400000) + 1) / 7);

}


No comments

Theme images by tjasam. Powered by Blogger.